我有一个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']
答案 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(可能是生成器)上工作)直接。