2

定型コードをあまり使わずにPythonでこれを行う方法を探しています。

リストがあるとします:

[(a,4),(b,4),(a,5),(b,3)]

最初のタプル値でソートし、リスト値を次のようにマージできる関数を見つけようとしています。

[(a,[4,3]),(b,[4,5])]

私はこれを単純な方法で行うことができることを知っていますが、より良い方法があるかどうか疑問に思っていました.

4

4 に答える 4

2

使用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)

于 2013-08-14T18:12:24.040 に答える
0

別のオプション (ここでも 'a' が最初のリストであると仮定)

[(key,[v2 for k2, v2 in a if k2 == key ]) for key in list(set(map(lambda x: x[0], a)))]
于 2013-08-14T18:49:30.547 に答える