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

时间:2017-05-29 10:41:55

标签: python sum reduce

我有一个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']

2 个答案:

答案 0 :(得分:4)

因为sum初始化为默认值0.使用空列表初始化:

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

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

答案 1 :(得分:1)

我将详细阐述@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函数所需的args的中间元组,而是在提供的iterable(可能是生成器)上工作)直接。