8

次の2つのタプルのリストがあるとしましょう

myList = [(1, 7), (3, 3), (5, 9)]
otherList = [(2, 4), (3, 5), (5, 2), (7, 8)]

returns => [(1, 7), (2, 4), (3, 8), (5, 11), (7, 8)]

タプルの最初の要素に交差があるかどうかをチェックして、これら2つのリストをマージするマージ操作を設計したいと思います。交差がある場合は、問題の各タプルの2番目の要素を追加します(2つをマージします)。操作後、最初の要素に基づいて並べ替えたいと思います。

明らかな解決策があるかなり一般的な問題だと思うので、これも投稿していますが、この質問には非常にPythonのような解決策があると思います;)

4

4 に答える 4

14

結果には辞書を使用します。

result = {}
for k, v in my_list + other_list:
    result[k] = result.get(k, 0) + v

タプルのリストが必要な場合は、を介して取得できますresult.items()。結果のリストは任意の順序になりますが、もちろん必要に応じて並べ替えることができます。

(Pythonのスタイル規則に準拠するようにリストの名前を変更したことに注意してください。)

于 2012-07-25T16:08:37.123 に答える
4

defaultdictを使用します。

from collections import defaultdict
results_dict = defaultdict(int)
results_dict.update(my_list)
for a, b in other_list:
    results_dict[a] += b
results = sorted(results_dict.items())

注:シーケンスを並べ替えるときsortedは、シーケンスの最初の項目で並べ替えます。最初の要素が同じである場合、2番目の要素を比較します。キーワード引数sortedを使用して、並べ替える関数を指定できます。key

results = sorted(results_dict.items(), key=lambda x: x[1]) #sort by the 2nd item

また

results = sorted(results_dict.items(), key=lambda x: abs(x[0])) #sort by absolute value
于 2012-07-25T16:12:06.710 に答える
2

itertoolsを使用する方法:

>>> myList = [(1, 7), (3, 3), (5, 9)]
>>> otherList = [(2, 4), (3, 5), (5, 2), (7, 8)]

>>> import itertools
>>> merged = []
>>> for k, g in itertools.groupby(sorted(myList + otherList), lambda e: e[0]):
...    merged.append((k, sum(e[1] for e in g)))
... 
>>> merged
[(1, 7), (2, 4), (3, 8), (5, 11), (7, 8)]

これは最初に2つのリストを連結し、それをソートします。itertools.groupbyは、タプルの最初の要素によってグループ化されたマージされたリストの要素を返すため、それらを合計してマージされたリストに配置します。

于 2012-07-25T16:10:08.010 に答える
0
>>> [(k, sum(v for x,v in myList + otherList if k == x)) for k in dict(myList + otherList).keys()]
[(1, 7), (2, 4), (3, 8), (5, 11), (7, 8)]
>>>

Python2.7と3.2の両方でテストすると
dict(myList + otherList).keys()、結合リストのキーのセットを含む反復可能オブジェクトが返され
sum(...)ます。「k」は結合リストを再度ループし、タプル項目「v」を追加します。ここで、k == x

...しかし、余分なループは処理のオーバーヘッドを追加します。Sven Marnachによって提案された明示的な辞書を使用すると、それを回避できます。

于 2012-07-26T16:23:55.427 に答える