2017-05-29 2 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

リストには文字列と数値ではないため、合計を使用できません。いずれにしても、それが機能していることを見て減らすのはなぜですか?使用後に重複しないようにするには、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恐ろしいのパフォーマンス)でリストをフラット化することをお勧めします。ネストされたcomprehensiこのために作成されたitertools.chain.from_iterableです。

1

私は@ moses-koledoeの答えを詳述します。これらのリストをフラット化するためには、itertools.chainを採用してください。

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

実際には、第2の方法は、以来、大規模なリストのもう少しパフォーマンスのかもしれません:あなたはアンパック構文(*list_of_lists)を回避したい場合

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

は、同じ機能のfrom_iterableバリエーションを使用しますchain関数を呼び出すために必要なargsの中間タプルは構築されませんが、提供されるiterable(ジェネレータかもしれません)で直接動作します。

関連する問題