Я чувствую, что упускаю что-то очевидное, но это так... Я хотел бы перейти от:
lst = [[0, 1, 3, 7, 8, 11, 12], [8, 0, 1, 2, 3, 14], 2]
to:
output = [0, 1, 3, 7, 8, 11, 12, 8, 0, 1, 2, 3, 14, 2]
Я могу сделать это с помощью цикла for, например:
output = []
for l in lst:
if hasattr(l, '__iter__'):
output.extend(l)
else:
output.append(l)
Может быть, цикл for в порядке, но кажется, что должен быть более элегантный способ сделать это... Попытка сделать это с помощью numpy кажется еще более запутанной, потому что рваные массивы не так легко обрабатываются... так что вы можете' т (например):
output = np.asanyarray(lst).flatten().tolist()
Заранее спасибо.
Обновление:
Вот мое сравнение двух методов, предоставленных @T.J и @Ashwini - спасибо обоим!
In [5]: %paste
from itertools import chain
from collections import Iterable
lis = [[0, 1, 3, 7, 8, 11, 12], [8, 0, 1, 2, 3, 14], 2]
def solve(lis):
for x in lis:
if isinstance(x, Iterable) and not isinstance(x, basestring):
yield x
else:
yield [x]
%timeit list(chain.from_iterable(solve(lis)))
%timeit [a for x in lis for a in (x if isinstance(x, Iterable) and not isinstance(x,basestring) else [x])]
## -- End pasted text --
100000 loops, best of 3: 10.1 us per loop
100000 loops, best of 3: 8.12 us per loop
Обновление 2:
...
lis = lis *10**5
%timeit list(chain.from_iterable(solve(lis)))
%timeit [a for x in lis for a in (x if isinstance(x, Iterable) and not isinstance(x,basestring) else [x])]
## -- End pasted text --
1 loops, best of 3: 699 ms per loop
1 loops, best of 3: 698 ms per loop
from compiler.ast import flatten; flatten([[0, 1, 3, 7, 8, 11, 12], [8, 0, 1, 2, 3, 14], 2])
->[0, 1, 3, 7, 8, 11, 12, 8, 0, 1, 2, 3, 14, 2]
- person Aya   schedule 22.06.2013lis = lis *10**5
,itertools.chain
быстрее, чем обычное понимание списка для списка большего размера, для небольших списков время не имеет значения. - person Ashwini Chaudhary   schedule 22.06.2013lis=lis *10**5
в значительной степени является переломным моментом между двумя методологиями. - person blazetopher   schedule 22.06.2013