定型コードをあまり使わずにPythonでこれを行う方法を探しています。
リストがあるとします:
[(a,4),(b,4),(a,5),(b,3)]
最初のタプル値でソートし、リスト値を次のようにマージできる関数を見つけようとしています。
[(a,[4,3]),(b,[4,5])]
私はこれを単純な方法で行うことができることを知っていますが、より良い方法があるかどうか疑問に思っていました.
定型コードをあまり使わずにPythonでこれを行う方法を探しています。
リストがあるとします:
[(a,4),(b,4),(a,5),(b,3)]
最初のタプル値でソートし、リスト値を次のようにマージできる関数を見つけようとしています。
[(a,[4,3]),(b,[4,5])]
私はこれを単純な方法で行うことができることを知っていますが、より良い方法があるかどうか疑問に思っていました.
使用collections.defaultdict(list)
:
from collections import defaultdict
lst = [("a",4), ("b",4), ("a",5), ("b",3)]
result = defaultdict(list)
for a, b in lst:
result[a].append(b)
print sorted(result.items())
# prints: [('a', [4, 5]), ('b', [4, 3])]
ソート前のアルゴリズムはO(n)
複雑です。group by アルゴリズムが持ってO(n * log(n))
おり、set/list/dict 内包表記はそれよりも大きなものを持っていますO(n^2)
別のオプション (ここでも 'a' が最初のリストであると仮定)
[(key,[v2 for k2, v2 in a if k2 == key ]) for key in list(set(map(lambda x: x[0], a)))]