像l=[[1,2],[3,4]]这样的多维列表可以通过执行sum(l,[])转换为一维列表。有人能解释一下这是怎么发生的吗?
一位回应者说,这种技术只能用于“扁平化”2D列表--它不适用于更高的多维列表。但是,如果重复,就会发生这种情况。例如,如果A是3D列表,则sum(sum(A),[]),[])会将A展平为1D列表。
发布于 2010-06-03 06:10:59
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) ->值
返回一个数字序列(而不是字符串)加上参数'start‘的值(默认为0)的和。
便笺
正如wallacoloo所评论的,这是,而不是,这是一个用于扁平化任何多维列表的通用解决方案。由于上述行为,它只适用于一维列表的列表。
更新
有关扁平化1层嵌套的方法,请参阅itertools页面中的以下食谱:
def flatten(listOfLists):
"Flatten one level of nesting"
return chain.from_iterable(listOfLists)要扁平化更深的嵌套列表(包括不规则嵌套列表),请参阅this question的accepted answer (还有一些其他问题链接到该问题本身)。
注意,配方返回一个itertools.chain对象(它是可迭代的),另一个问题的答案返回一个generator对象,所以如果您想要完整的列表而不是遍历整个列表,您需要将它们中的任何一个包装在对list的调用中。例如list(flatten(my_list_of_lists))。
发布于 2010-06-03 09:47:52
如果您的列表nested如您所说,是"2D“的(意思是您只想往下一层,而nested的所有向下1层的项都是列表),那么就有一个简单的列表理解:
flat = [x for sublist in nested for x in sublist]是我推荐的方法--比sum要高效得多(sum是为numbers设计的--以某种方式阻止所有对非数字求和的尝试实在是太麻烦了……我是Python标准库中sum的最初提出者和第一个实现者,所以我想我应该知道;-)。
如果你想“尽可能深入”(对于深度嵌套的列表),递归是最简单的方法,尽管通过消除递归你可以获得更高的性能(代价是更高的复杂性)。
This recipe提出了递归解决方案、递归消除和其他方法(所有这些方法都很有启发性,但都没有我在前面的答案中提出的一行程序那么简单)。
发布于 2016-11-15 11:58:12
对于任何类型的多直径数组,此代码将展平到一维:
def flatten(l):
try:
return flatten(l[0]) + (flatten(l[1:]) if len(l) > 1 else []) if type(l) is list else [l]
except IndexError:
return []https://stackoverflow.com/questions/2961983
复制相似问题