问题:sum如何扁平化列表?

l=[[1,2],[3,4]]这样的多维列表可以通过sum(l,[])转换为一维列表。这是怎么发生的?

(这不适用于更高的多维列表,但可以重复处理这些情况。例如,如果 A 是 3D 列表,则 sum(sum(A),[]),[] ) 将 A 展平为一维列表。)

解答

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]),这将导致 + 的 _unsupported 操作数类型:'int' 和 'list' _

这是sum帮助的相关部分:

sum(sequence[, start]) -> 值

返回数字序列(不是字符串)加上参数“start”的值(默认为 0)的总和。

笔记

正如wallacoloo评论的那样,这不是扁平化任何多维列表的通用解决方案。由于上述行为,它仅适用于一维列表的列表。

更新

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

def flatten(listOfLists):
    "Flatten one level of nesting"
    return chain.from_iterable(listOfLists)

要展平更深的嵌套列表(包括不规则嵌套列表),请参阅接受的答案到这个问题(还有一些其他问题与该问题本身相关联。)

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

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐