是一个简短的语法连接列表列表到一个单一的列表(或迭代器)在python?
例如,我有一个列表,如下所示,我想迭代a,b和c。
x = [["a","b"], ["c"]]
我能想到的最好的是如下。
result = []
[ result.extend(el) for el in x]
for el in result:
print el
是一个简短的语法连接列表列表到一个单一的列表(或迭代器)在python?
例如,我有一个列表,如下所示,我想迭代a,b和c。
x = [["a","b"], ["c"]]
我能想到的最好的是如下。
result = []
[ result.extend(el) for el in x]
for el in result:
print el
当前回答
import itertools
a = [['a','b'], ['c']]
print(list(itertools.chain.from_iterable(a)))
这给了
['a', 'b', 'c']
其他回答
这就是所谓的扁平化,有很多实现。
这个怎么样,尽管它只适用于1级深嵌套:
>>> x = [["a","b"], ["c"]]
>>> for el in sum(x, []):
... print el
...
a
b
c
从这些链接中,显然最完整的-fast-elegant-etc实现如下:
def flatten(l, ltypes=(list, tuple)):
ltype = type(l)
l = list(l)
i = 0
while i < len(l):
while isinstance(l[i], ltypes):
if not l[i]:
l.pop(i)
i -= 1
break
else:
l[i:i + 1] = l[i]
i += 1
return ltype(l)
x = [["a","b"], ["c"]]
result = sum(x, [])
您所描述的就是所谓的将列表扁平化,有了这些新知识,您将能够在谷歌上找到许多解决方案(没有内置的扁平化方法)。以下是其中一个,来自http://www.daniel-lemire.com/blog/archives/2006/05/10/flattening-lists-in-python/:
def flatten(x):
flat = True
ans = []
for i in x:
if ( i.__class__ is list):
ans = flatten(i)
else:
ans.append(i)
return ans
import itertools
a = [['a','b'], ['c']]
print(list(itertools.chain.from_iterable(a)))
这给了
['a', 'b', 'c']
对于一级扁平化,如果你关心速度,在我尝试过的所有条件下,这比之前的任何答案都快。(也就是说,如果您需要结果作为列表。如果你只需要在运行中迭代它,那么链的例子可能更好。)它的工作原理是预先分配一个最终大小的列表,并按片复制部分(这是一种比任何迭代器方法都低级别的块复制):
def join(a):
"""Joins a sequence of sequences into a single sequence. (One-level flattening.)
E.g., join([(1,2,3), [4, 5], [6, (7, 8, 9), 10]]) = [1,2,3,4,5,6,(7,8,9),10]
This is very efficient, especially when the subsequences are long.
"""
n = sum([len(b) for b in a])
l = [None]*n
i = 0
for b in a:
j = i+len(b)
l[i:j] = b
i = j
return l
带注释的排序时间列表:
[(0.5391559600830078, 'flatten4b'), # join() above.
(0.5400412082672119, 'flatten4c'), # Same, with sum(len(b) for b in a)
(0.5419249534606934, 'flatten4a'), # Similar, using zip()
(0.7351131439208984, 'flatten1b'), # list(itertools.chain.from_iterable(a))
(0.7472689151763916, 'flatten1'), # list(itertools.chain(*a))
(1.5468521118164062, 'flatten3'), # [i for j in a for i in j]
(26.696547985076904, 'flatten2')] # sum(a, [])