例えば:
l = [('a',1),('b',2),('a',2)]
collapsed_l = dict(a=[1,2],b=[2])
l
からに行くのに最適な方法はcollapsed_l
?
ある意味で、私が崩壊している「フィールド」と、そのフィールドを一般化する方法が必要です。これは、データベースやスプレッドシートでピボットテーブルが行うことと似ていると思いますが、間違っている可能性があります。
例えば:
l = [('a',1),('b',2),('a',2)]
collapsed_l = dict(a=[1,2],b=[2])
l
からに行くのに最適な方法はcollapsed_l
?
ある意味で、私が崩壊している「フィールド」と、そのフィールドを一般化する方法が必要です。これは、データベースやスプレッドシートでピボットテーブルが行うことと似ていると思いますが、間違っている可能性があります。
>>> from collections import defaultdict
>>> l = [('a',1),('b',2),('a',2)]
>>> collapsed_l = defaultdict(list)
>>> for letter,num in l:
collapsed_l[letter].append(num)
>>> collapsed_l
defaultdict(<type 'list'>, {'a': [1, 2], 'b': [2]})
>>> from itertools import groupby
>>> from operator import itemgetter
>>> l = [('a',1),('b',2),('a',2)]
>>> dict((k,[n for l,n in v]) for k,v in groupby(sorted(l),itemgetter(0)))
{'a': [1, 2], 'b': [2]}
折りたたまれた値の順序が重要かどうかわからない場合は、編集できsorted(l)
ますsorted(l,key=itemgetter(0))
最もクリーンなのは、タプルのリストをループして、要素を辞書に追加することです。Setdefault は、キーが存在しない場合に空のリストが追加されることを保証します。キーが存在する場合、要素はリストに追加されます。
>>> d=dict()
>>> for k,e in l:
d.setdefault(k,[]).append(e)
>>> d
{'a': [1, 2], 'b': [2]}
collections.defaultdict
この目的で使用することもできます。この場合、setdefault
メソッドは必要ありません。