1

これらの2つのリストを考えると

L2 = [A,B,C,D,A,B]
L3 = [3,2,1,2,2,1]

入手したい

L2_WANTED = [A,B,C,D]
L3_WANTED = [5,3,1,2]

リストは常に順序付けられており、同じサイズと要素がキーと値のペア(A:3、B:2など)として対応しています。

目的は、L2の重複を排除し、L3の対応する項を合計して、一致するペアを持つ新しいリストを取得することです。これは、アイテムがリストに追加されるときに、アイテムの実行リストを保持するためです。

で関数を書こうとしましたindexが、醜くなり始めました。確認itertoolsしましたが、関連するものは見つかりませんでした。私は見ましstarmap()たが、それを機能させることができませんでした。おそらく、これはリスト内包表記でも実行できます。この最も簡単な方法を実現する方法についての手がかりや指示をいただければ幸いです。ありがとうございました。

編集

@SimonC:

>>> l2_sum = {}
>>> for i in range(0, len(L2)):
        key = L2[i]
        num = L3[i]
        l2_sum[key] = l2_sum.get(key, 0) + num


>>> l2_sum
{'A': 5, 'C': 1, 'B': 3, 'D': 2}
>>>

これはどのようにして重複を排除し、数字を追加しますか?手がかりを教えてもらえますか?ありがとう。

4

3 に答える 3

2

zipを使用することは、リストを組み合わせる良い方法だと思います。dict.update前の値をフェッチして更新するため、この部分は合計を行います。

foo = dict()
for x, y in zip(['A', 'B', 'C', 'D', 'A', 'B'],
                [3, 2, 1, 2, 2, 1]):
    foo[x] = y + foo.get(x, 0)

print foo

出力: {'A': 5, 'C': 1, 'B': 3, 'D': 2}

編集:

上記は問題ありませんが、辞書を作成するときにitertools.izipを使用することも検討します。zipこのようにして、メモリを節約します。必要なのは、インポート後に置き換えるzipだけitertools.izipですiterools

于 2010-11-04T01:01:12.440 に答える
2

そこにはもっとエレガントな答えがあり、返信に来ると確信しています。

しかし、いくつかの簡単な答えについては:

L2 = ['A','B','C','D','A','B']
L3 = [3,2,1,2,2,1]

L4 = zip(L2, L3)

L5 = []
L6 = []
def freduce(l):
    for x, y in l:
        print x , y
        if x in L5:
            k = L5.index(x)
            L6[k] += y
        else:
            L5.append(x)
            L6.append(y)

freduce(L4)  
print L5
print L6

出力:

['A', 'B', 'C', 'D']
[5, 3, 1, 2]

[2 番目の実装を理解するための回答を編集]

>>> L3 = [3,2,1,2,2,1]
>>> L2 = ['A','B','C','D','A','B']
>>> range(0, len(L2))
[0, 1, 2, 3, 4, 5]
>>> 

したがって、 for i in range(0, len(L2)): ... i はインデックスになります

このインデックスを使用すると、次のようにして L3 と L2 から情報を抽出できます。

key = L2[i]
num = L3[i]

次に、辞書に情報を追加します

l2_sum[key] = l2_sum.get(key, 0) + num

ここで l2_sum.get(key, 0) は、キーが存在しない場合は 0 を返し、それ以外の場合は現在の値を返します。

十分に明確であることを願っています。

于 2010-11-03T05:25:36.560 に答える
1

これでうまくいきますが、pyfuncによると、もっと良い方法があります。

l2_sum = {}
for i in range(0,len(L2)):
    key = L2[i]
    num = L3[i]
    l2_sum[key] = l2_sum.get(key, 0) + num

L2_WANTED = sorted(l2_sum.keys())
L3_WANTED = [l2_sum[key] for key in L2_WANTED]
于 2010-11-03T05:28:22.580 に答える