2017-05-29 146 views
0

我有一個list_of_lists,我想創建一個包含所有內部列表的所有元素的列表。我不明白爲什麼不能使用sum來實現這一點。在列表中使用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

你不能使用sum,因爲你的列表包含字符串而不是數值。在任何情況下,爲什麼不使用減少看到它的工作?如果你不想在使用後重復,可以使用list(set(your_list))https://docs.python.org/2/tutorial/datastructures.html –

+0

請閱讀[sum'的文檔](https ://docs.python.org/3/library/functions.html#sum)。 – poke

回答

4

因爲sum有一個默認的0初始化一個空列表,而不是初始化:

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

但是,它不是一個好想法與sum可怕的表現)平展名單,你可以使用嵌套綜合on或itertools.chain.from_iterable這是爲此創建的。

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函數所需的參數的中間元組,但可直接在提供的迭代器(可能是一個生成器)上工作。