在列表列表中使用 sum() 时出错

error using sum() on list of lists

我有一个 list_of_lists,我想创建一个包含所有内部列表的所有元素的列表。我不明白为什么不能使用 sum 来实现这个。

list_of_lists = [['element 1','element 2'],['element 1']]
print(sum(list_of_lists))
>> TypeError: unsupported operand type(s) for +: 'int' and 'list'

如果我使用 reduce 它工作正常:

from functools import reduce
print(reduce(lambda x,y: x+y, list_of_lists))
>> ['element 1', 'element 2', 'element 1']

因为 sum 使用默认值 0 进行初始化。改为使用空列表进行初始化:

print(sum(list_of_lists, []))
# ['element 1', 'element 2', 'element 1']

但是,用 sum 来展平列表并不是一个好主意(可怕的 性能),您可以使用嵌套理解或 itertools.chain.from_iterable为此而创建。

我将详细说明@moses-koledoe 的回答。为了展平这些列表(实际上,这就是您要实现的目标),请使用 itertools.chain.

from itertools import chain    
list_of_lists = [['element 1','element 2'],['element 1']]
list(chain(*list_of_lists))
>> ['element 1', 'element 2', 'element 1']

如果您想避免使用解包语法 (*list_of_lists),请使用具有相同功能的 from_iterable 变体:

list(chain.from_iterable(list_of_lists))
>> ['element 1', 'element 2', 'element 1']

实际上,第二种方法在大型列表上的性能可能更高一些,因为它不构造调用 chain 函数所需的参数中间元组,而是对提供的可迭代对象(可能是发电机)直接。