首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中将多维列表转换为一维列表

在Python中将多维列表转换为一维列表
EN

Stack Overflow用户
提问于 2010-06-03 06:08:06
回答 7查看 78.3K关注 0票数 34

l=[[1,2],[3,4]]这样的多维列表可以通过执行sum(l,[])转换为一维列表。有人能解释一下这是怎么发生的吗?

一位回应者说,这种技术只能用于“扁平化”2D列表--它不适用于更高的多维列表。但是,如果重复,就会发生这种情况。例如,如果A是3D列表,则sum(sum(A),[]),[])会将A展平为1D列表。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 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页面中的以下食谱:

代码语言:javascript
复制
def flatten(listOfLists):
    "Flatten one level of nesting"
    return chain.from_iterable(listOfLists)

要扁平化更深的嵌套列表(包括不规则嵌套列表),请参阅this questionaccepted answer (还有一些其他问题链接到该问题本身)。

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

票数 45
EN

Stack Overflow用户

发布于 2010-06-03 09:47:52

如果您的列表nested如您所说,是"2D“的(意思是您只想往下一层,而nested的所有向下1层的项都是列表),那么就有一个简单的列表理解:

代码语言:javascript
复制
flat = [x for sublist in nested for x in sublist]

是我推荐的方法--比sum要高效得多(sum是为numbers设计的--以某种方式阻止所有对非数字求和的尝试实在是太麻烦了……我是Python标准库中sum的最初提出者和第一个实现者,所以我想我应该知道;-)。

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

This recipe提出了递归解决方案、递归消除和其他方法(所有这些方法都很有启发性,但都没有我在前面的答案中提出的一行程序那么简单)。

票数 49
EN

Stack Overflow用户

发布于 2016-11-15 11:58:12

对于任何类型的多直径数组,此代码将展平到一维:

代码语言:javascript
复制
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 []
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2961983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档