我有一个列表如下:如何将2D列表平铺为1D而不使用numpy?
[[1,2,3],[1,2],[1,4,5,6,7]]
,我想它压扁成[1,2,3,1,2,1,4,5,6,7]
是有重量轻,功能要做到这一点,而无需使用numpy的?
我有一个列表如下:如何将2D列表平铺为1D而不使用numpy?
[[1,2,3],[1,2],[1,4,5,6,7]]
,我想它压扁成[1,2,3,1,2,1,4,5,6,7]
是有重量轻,功能要做到这一点,而无需使用numpy的?
没有numpy的(ndarray.flatten
),可以使用chain.from_iterable
作为用于itertools.chain
替代构造:
>>> list(chain.from_iterable([[1,2,3],[1,2],[1,4,5,6,7]]))
[1, 2, 3, 1, 2, 1, 4, 5, 6, 7]
也可以在3是更有效的用于短列表在Python 2和functools.reduce
使用reduce
:
>>> reduce(lambda x,y :x+y ,[[1,2,3],[1,2],[1,4,5,6,7]])
[1, 2, 3, 1, 2, 1, 4, 5, 6, 7]
或者使用列表理解:
[j for i in [[1,2,3],[1,2],[1,4,5,6,7]] for j in i]
基准:
:~$ python -m timeit "from itertools import chain;chain.from_iterable([[1,2,3],[1,2],[1,4,5,6,7]])"
1000000 loops, best of 3: 1.58 usec per loop
:~$ python -m timeit "reduce(lambda x,y :x+y ,[[1,2,3],[1,2],[1,4,5,6,7]])"
1000000 loops, best of 3: 0.791 usec per loop
:~$ python -m timeit "[j for i in [[1,2,3],[1,2],[1,4,5,6,7]] for j in i]"
1000000 loops, best of 3: 0.784 usec per loop
一个基准上@ WILL的回答是使用sum
(其快速的短名单,但时间不长名单):
:~$ python -m timeit "sum([[1,2,3],[4,5,6],[7,8,9]], [])"
1000000 loops, best of 3: 0.575 usec per loop
:~$ python -m timeit "sum([range(100),range(100)], [])"
100000 loops, best of 3: 2.27 usec per loop
:~$ python -m timeit "reduce(lambda x,y :x+y ,[range(100),range(100)])"
100000 loops, best of 3: 2.1 usec per loop
这将在您的特定情况下工作。如果您有多个嵌套可迭代级别,则递归函数将最有效。
def flatten(input):
new_list = []
for i in input:
for j in i:
new_list.append(j)
return new_list
这是实际为深度嵌套列表工作的唯一解决方案。 – Johan 2017-10-26 19:24:53
对于这样的一个列表,我最喜欢的整洁的小技巧只是使用sum
;
sum
有一个可选参数:sum(iterable [, start])
,所以你可以做:
list_of_lists = [[1,2,3], [4,5,6], [7,8,9]]
print sum(list_of_lists, []) # [1,2,3,4,5,6,7,8,9]
这个工程,因为+
运营商恰好是列出了连接运算符,你已经告诉它的初始值是[]
- 一个空的列表。
但文档sum
建议您使用itertools.chain
,因为它更清晰。
'sum([[1,2,3],[4,5,6],[7,8,9]],[])'如何与这些进行比较? – will 2015-03-24 23:12:32
@will简短列出它的速度比减少,但更长的列表不是! – Kasramvd 2015-03-25 07:02:17