25

Python には 2 つの辞書があります。

d1 = {'a': 10, 'b': 9, 'c': 8, 'd': 7}
d2 = {'a': 1, 'b': 2, 'c': 3, 'e': 2}

辞書 d1-d2 の間で値を減算して結果を取得したい:

d3 = {'a': 9, 'b': 7, 'c': 5, 'd': 7 }

現在、2 つのループを使用していますが、このソリューションは速すぎません。

for x,i in enumerate(d2.keys()):
        for y,j in enumerate(d1.keys()):
4

4 に答える 4

38

非常に Pythonic な方法は、辞書内包表記を使用することだと思います:

d3 = {key: d1[key] - d2.get(key, 0) for key in d1}

これは Python 2.7+ または 3 でのみ機能することに注意してください。

于 2013-07-16T08:57:36.333 に答える
25

collections.Counter結果のすべての値が厳密に正であることがわかっている場合は、を使用します。構文は非常に簡単です。

>>> from collections import Counter
>>> d1 = Counter({'a': 10, 'b': 9, 'c': 8, 'd': 7})
>>> d2 = Counter({'a': 1, 'b': 2, 'c': 3, 'e': 2})
>>> d3 = d1 - d2
>>> print d3
Counter({'a': 9, 'b': 7, 'd': 7, 'c': 5})

すべての値が厳密に正のままであることがわかっているわけではない場合、注意してください。

  • 値がゼロになる要素は結果から除外されます
  • 値が負になる要素は失われるか、間違った値に置き換えられます。例:print(d2-d1)を生成できCounter({'e': 2})ます。
于 2013-07-16T08:45:52.963 に答える
14

Haidroの回答を更新するだけです。

「-」の代わりに減算方式を使用することをお勧めします。

d1.減算(d2)

- を使用すると、正のカウンターのみが辞書に更新されます。以下の例を参照してください

c = Counter(a=4, b=2, c=0, d=-2)
d = Counter(a=1, b=2, c=3, d=4)
a = c-d
print(a)        # --> Counter({'a': 3})
c.subtract(d)
print(c)        # --> Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})

減算メソッドを使用すると、辞書が更新されることに注意してください。

そして最後に dict(c) を使用して Counter オブジェクトから Dictionary を取得します

于 2013-07-16T08:59:07.220 に答える
4

Haidro は簡単な解決策を投稿しましたが、collections必要なループは 1 つだけです。

d1 = {'a': 10, 'b': 9, 'c': 8, 'd': 7}
d2 = {'a': 1, 'b': 2, 'c': 3, 'e': 2}
d3 = {}

for k, v in d1.items():
    d3[k] = v - d2.get(k, 0) # returns value if k exists in d2, otherwise 0

print(d3) # {'c': 5, 'b': 7, 'a': 9, 'd': 7}
于 2013-07-16T08:49:23.690 に答える