在列表列表中使用 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
函数所需的参数中间元组,而是对提供的可迭代对象(可能是发电机)直接。
我有一个 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
函数所需的参数中间元组,而是对提供的可迭代对象(可能是发电机)直接。