Форум сайта python.su
6
Иногда возникает вот такая задача, есть список с одним уровнем вложенности, типа
a = [[1,2,3],[4,5,6],[7,8,9]]
[x for x in a]
>>> d = [] >>> [d.extend(x) for x in a] [None, None, None] >>> d [1, 2, 3, 4, 5, 6, 7, 8, 9]
Офлайн
25
а почему имеено в одну строчку?
Для случаев любой вложенности я использую свой велосипед:
def flattern(iterable): ''' Makes iterable 'flat' >>> list(flattern([ ... (1, 2), set([3, 4]), 'test', 5 ... ])) [1, 2, 3, 4, 'test', 5] >>> list(flattern([ ... (1, 2, 3, ), ... ([ ... [4, 5], ... [6, 7]], ... 8, ... set([9, 10]) ... ), ... ( ... 'test1', ('test2', ) ... ), ... 666 ... ])) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'test1', 'test2', 666] >>> list(flattern('abc')) ['abc'] ''' if not hasattr(iterable, '__iter__'): yield iterable return for it in iterable: for i in flattern(it): yield i
Отредактировано s0rg (Авг. 16, 2013 14:56:59)
Офлайн
43
from functools import reduce from operator import add a = [[1,2,3],[4,5,6],[7,8,9]] reduce(add, a[1:], a[0]) Out[4]: [1, 2, 3, 4, 5, 6, 7, 8, 9] from itertools import chain list(chain.from_iterable(a)) Out[6]: [1, 2, 3, 4, 5, 6, 7, 8, 9] list(chain(*a)) Out[7]: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Офлайн
6
потому что подобная задача возникает “на месте”, когда думаешь, что неплохо бы прицепить такой паровоз и спустить в шаблон. в случае одной строчки - прицепил, не задумываясь, потратил 10 секунд и не отвлёкся от мысли. в ином случае нужно думать, что и как городить, и стоит ли вообще это городить
такие задачи не планируются, а спонтанно обнаруживаются
да и вообще, можно ли для разных .update, .extend и прочих, которые работают “в себе”, возвращать результат в виде полученных данных? а то многие об это спотыкаются 
а флатен красивый, спасибо, записал. красивее чем те, что я краем глаза цеплял. на конкурсе “слеза рубиста” я бы дал первое место 
Офлайн
43
sum(a, []) Out[8]: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Офлайн
6
chain я покрутил, правда на другой задаче, получалось не так. как хотел, да и забросил его. спасибо за напоминание и за хороший пример.
from functools import reduce
reduce(add, a[1:], a[0])
Офлайн
6
sergeek
sum(a, )
Офлайн
25
sergeek
Это работает _только_ для списка чисел, к сожалению
Офлайн
6
# -*- coding: utf-8 -*- a = [dict(t=['1z','2y','x3']),dict(t=['four','fif','sikz']),dict(t=[u'сэм',u'восэм',u'дэвять'])] print sum([x['t'] for x in a],[])
['1z', '2y', 'x3', 'four', 'fif', 'sikz', u'\u0441\u044d\u043c', u'\u0432\u043e\u0441\u044d\u043c', u'\u0434\u044d\u0432\u044f\u0442\u044c']
Офлайн
43
s0rgкакой вариант?
Это работает _только_ для списка чисел, к сожалению
Офлайн