在Python中将多维列表转换为1D列表

Say*_*yan 30 python

像这样的多维列表l=[[1,2],[3,4]]可以通过执行转换为1D 列表sum(l,[]).任何人都可以解释一下这是怎么回事?

响应者说,这种技术只能用于"压扁"2D列表 - 它不适用于更高的多维列表.但如果重复,它确实如此.例如,如果A是3D列表,则sum(sum(A),[]),[])将A压缩为1D列表.

Ale*_*lli 42

如果您的列表nested是"2D"(意味着您只想向下一级,并且所有1级向下的项目nested都是列表),那么一个简单的列表理解:

flat = [x for sublist in nested for x in sublist]
Run Code Online (Sandbox Code Playgroud)

是我推荐的方法 - 比summing 更有效(sum用于数字 - 以某种方式让它阻止所有"加"非数字的尝试太麻烦...我是sumPython标准库中的原始提议者和第一个实现者,所以我想我应该知道;-).

如果你想"尽可能深入"(对于深度嵌套的列表),递归是最简单的方法,尽管通过消除递归可以获得更高的性能(以更高的复杂性为代价).

这个方法提出了一个递归解决方案,一个递归消除和其他方法(所有这些方法都很有用,但没有一个像我在本回答中提到的单线程一样简单).

  • @NobodyMan,当然,它只是两个嵌套循环:就好像在一个外部语句中`对于嵌套中的子列表:`你为子列表中的x缩进了另一个语句``然后在它里面只取了前导表达式`x`的列表推导将作为您正在构建的新列表的下一项附加.换句话说,它的工作原理与任何其他列表理解完全相同,只有两个`for`子句 - 尽管`for`子句之前的前导表达式在这种情况下非常简单:-). (2认同)

mik*_*kej 37

sum使用+运算符将序列添加到一起.例如sum([1,2,3]) == 6.第二个参数是可选的起始值,默认为0.例如sum([1,2,3], 10) == 16.

在您的示例中,它确实[] + [1,2] + [3,4]+2个列表连接在一起.因此结果是[1,2,3,4]

空列表是第二个参数,sum因为如上所述,默认值是sum添加到0(即0 + [1,2] + [3,4]),这将导致+:'int'和'list'的操作数类型不受支持

这是帮助的相关部分sum:

sum(sequence [,start]) - > value

返回一系列数字(非字符串)加上参数'start'的值(默认为0).

注意

正如wallacoloo所述,这不是用于展平任何多维列表的通用解决方案.由于上述行为,它仅适用于1D列表的列表.

更新

有关展平1级嵌套的方法,请参阅itertools页面中的此配方:

def flatten(listOfLists):
    "Flatten one level of nesting"
    return chain.from_iterable(listOfLists)
Run Code Online (Sandbox Code Playgroud)

扁平化更加深入嵌套列表(包括不规则嵌套的列表)看接受的答案了这个问题(也有从这个问题本身与一些其他问题.)

请注意,配方返回一个itertools.chain对象(可迭代),另一个问题的答案返回一个generator对象,因此list如果您想要完整列表而不是迭代它,则需要在调用中包装其中任何一个.例如list(flatten(my_list_of_lists)).