2016-11-24 6 views
1

2つのカウンタオブジェクトがあり、それらをマージしたい場合は、1つの新しい値を追加し、2つのカウンタに同じ値が含まれている場合、Pythonで最大の合計を保持する2つのカウンタオブジェクトをマージする

Counter a = { "apple":3, "peach":1, "pears":7, "watermelon":2, "grapes":7 } 

Counter b = { "apple":12, "kiwi":9, "grapes":2, "pears":21, "pineapple":2, "oranges":2 } 

#desired output 
counter c = { "apple":12, "pears":21, "grapes":7 "peach":1, "watermelon":2, "pineapple":2, "oranges":2} 

は現在、私はカウンターを更新しようとしたが、それは二つのカウンタをマージしているようだが、その数を合計します。私はちょうどカウンターをマージし、最大値を保持するか、カウンターに1つもない場合は追加したいと思います。

+2

あなたの質問には「新しい値を加える」と書かれていますが、あなたの望む出力には一般的なものだけが含まれています。 – DeepSpace

+0

@DeepSpaceあなたは正しいです、私はすでに2つのカウンターの交差点を持っていましたが、ユニークなアイテムも追加したいと思います。最初の質問を明確にすることを願っています。 – user1610950

+0

私の答えを見るhttp://stackoverflow.com/a/40780812/1453822 – DeepSpace

答えて

2

OPが自分の質問を編集した後、所望の出力は、単純にビット単位またはを使用することによって達成することができます(「|」)演算子:

from collections import Counter 

a = Counter({ "apple":3, "peach":1, "pears":7, "watermelon":2, "grapes":7 }) 

b = Counter({ "apple":12, "kiwi":9, "grapes":2, "pears":21, "pineapple":2, "oranges":2 }) 

c = a | b 

print(c) 
>> Counter({'pears': 21, 'apple': 12, 'kiwi': 9, 'grapes': 7, 'watermelon': 2, 'oranges': 2, 
      'pineapple': 2, 'peach': 1}) 
+0

うわー、私は間違いなくこれを工学していた。ありがとうございました! – user1610950

+0

1 | 4 == 5.私はうまくいくとは思わない。 – Akaberto

+0

@Akabertoどういう意味ですか? – DeepSpace

2

あなたは作り付けa&bを使用してCounter年代のそれぞれから個別の鍵を取り、このようなあなたの希望の最大のロジックを得るためにそれらを使用することができます。ここでは

Counter({key:max(a[key], b[key]) for key in a&b}) 

は、サンプルの実行です:

>>> from collections import Counter 
>>> a=Counter({ "apple":3, "peach":1, "pears":7, "watermelon":2, "grapes":7 }) 
>>> b=Counter({ "apple":12, "kiwi":9, "grapes":2, "pears":21, "pineapple":2, "oranges":2 }) 
>>> Counter({key:max(a[key], b[key]) for key in a&b}) 
Counter({'pears': 21, 'apple': 12, 'grapes': 7}) 
>>> 

pythonで既に構築されている一般的な要素の最小値をこの構造で指定したい場合は、次のように注意してください。

>>> a&b 
Counter({'pears': 7, 'apple': 3, 'grapes': 2}) 
>>> 
1

最大値を取得するためにmaxを使用しながら、次の2つのカウンターのキーの交差点を取り、dictの理解にそれを反復処理することができます:上記のPython 2あなたに、唯一のPython 3で動作します

>>> a = Counter({ "apple":3, "peach":1, "pears":7, "watermelon":2, "grapes":7 }) 
>>> b = Counter({ "apple":12, "kiwi":9, "grapes":2, "pears":21, "pineapple":2, "oranges":2 }) 
>>> Counter({k: max(a[k], b[k]) for k in a.keys() & b.keys()}) 
Counter({'pears': 21, 'apple': 12, 'grapes': 7}) 

注意を代わりにviewkeysを呼び出す必要があります:

>>> Counter({k: max(a[k], b[k]) for k in a.viewkeys() & b.viewkeys()}) 
Counter({'pears': 21, 'apple': 12, 'grapes': 7}) 
関連する問題