Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在不使用numpy的情况下将2D列表展平为1D?_Python_Arrays_List_Numpy - Fatal编程技术网

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]