Python 如何在不使用numpy的情况下将2D列表展平为1D?
我有一个列表,如下所示:Python 如何在不使用numpy的情况下将2D列表展平为1D?,python,arrays,list,numpy,Python,Arrays,List,Numpy,我有一个列表,如下所示: [[1,2,3],[1,2],[1,4,5,6,7]] 我想把它展平成[1,2,3,1,2,1,4,5,6,7] 是否有一个轻量级函数可以在不使用numpy的情况下执行此操作?不使用numpy()的一种方法是使用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] 或者,作为另
[[1,2,3],[1,2],[1,4,5,6,7]]
我想把它展平成[1,2,3,1,2,1,4,5,6,7]
是否有一个轻量级函数可以在不使用numpy的情况下执行此操作?不使用numpy()的一种方法是使用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]
或者,作为另一种类似python的方法,您可以使用列表理解:
[j for sub in [[1,2,3],[1,2],[1,4,5,6,7]] for j in sub]
另一种非常适合短列表的功能方法也可以是Python2中的reduce
,以及Python3中的functools.reduce
(不要将其用于长列表):
要使其稍微快一点,您可以使用内置的操作符。添加,而不是lambda
:
In [6]: from operator import add
In [7]: reduce(add ,[[1,2,3],[1,2],[1,4,5,6,7]])
Out[7]: [1, 2, 3, 1, 2, 1, 4, 5, 6, 7]
In [8]: %timeit reduce(lambda x,y :x+y ,[[1,2,3],[1,2],[1,4,5,6,7]])
789 ns ± 7.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [9]: %timeit reduce(add ,[[1,2,3],[1,2],[1,4,5,6,7]])
635 ns ± 4.38 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
基准:
:~$ 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
(短名单快速,长名单快速):
这将在您的特定情况下起作用。如果有多层嵌套的可重用项,则递归函数将最有效
def flatten(input):
new_list = []
for i in input:
for j in i:
new_list.append(j)
return new_list
对于这样的列表,我最喜欢的小技巧就是使用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]
这是因为+
运算符恰好是列表的串联运算符,并且您已经告诉它起始值是[]
——一个空列表
但是,for的文档建议您改为使用,因为它更清楚。与这些相比,的总和([[1,2,3],[4,5,6],[7,8,9],[])如何?@will对于短列表比减少快,但对于长列表则不然@Kasramvd真棒的回应!但是我很困惑,像[j为I在[[1,2,3],[1,2],[1,4,5,6,7]]为j在I]
中这样的非嵌套列表理解是如何将2d列表展平的,你能再举一些例子吗?@WeisiZhan这种列表理解通常被称为嵌套的,因为嵌套的为循环。为了理解此类列表理解的行为,您可以使用嵌套的for lop并将所有项目附加到先前定义的列表中。比如,lst=[];对于所有列表中的子列表:对于子列表中的项目:lst.append(item)
@Kasramvd谢谢!:-)这是唯一适用于深度嵌套列表的解决方案。如何处理字符串列表?@pyd上述代码适用于任何对象类型。。。为什么不在询问之前先测试一下呢?我的列表看起来像[“A”、[“B”、“C”]、“D”、[“E”、“F”]]
它不起作用,@pyd它不起作用,因为“A”不是一个列表,但[“B”、“C”]是这样的,当它试图使用+连接它们时失败了(你不能向列表中添加字符串),使用+
作为sum
中的连接,这就像一个奇迹。非常感谢。这对于任何列表都是很好的解决方案。
def flatten(input):
new_list = []
for i in input:
for j in i:
new_list.append(j)
return new_list
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]