11

辞書を更新する最も効率的で Pythonic (主に効率的な) 方法を探していますが、既存のキーが存在する場合は古い値を保持します。例えば...

myDict1 = {'1': ('3', '2'), '3': ('2', '1'), '2': ('3', '1')}
myDict2 = {'4': ('5', '2'), '5': ('2', '4'), '2': ('5', '4')}

myDict1.update(myDict2) gives me the following....

{'1': ('3', '2'), '3': ('2', '1'), '2': ('5', '4'), '5': ('2', '4'), '4': ('5', '2')}

キー「2」が両方の辞書に存在し、以前は値 (「3」、「1」) を持っていましたが、現在は myDict2 のキーの値 (「5」、「4」) を持っていることに注意してください。

キー「2」が値 (「3」、「1」、「5」、「4」) を持つように効率的に辞書を更新する方法はありますか? #順不同

前もって感謝します

4

5 に答える 5

10

これを行うには、次のような方法が最も効果的だと思います。

for k, v in myDict2.iteritems():
    myDict1[k] = myDict1.get(k, ()) + v

しかしupdate、残念ながら、あなたが探しているものに相当するものはありません。

于 2013-05-25T01:32:08.660 に答える
4

大きな辞書をマージする最も速い方法は、辞書を実際にマージせずにマージされているかのように動作する中間オブジェクトを導入することです ( @Raymond Hettinger の回答を参照)。

from collections import ChainMap

class MergedMap(ChainMap):
    def __getitem__(self, key):
        result = []
        found = False
        for mapping in self.maps:
            try:
                result.extend(mapping[key])
                found = True
            except KeyError:
                pass
        return result if found else self.__missing__(key)

merged = MergedMap(myDict1, myDict2)

適用できるかどうかは、結合された辞書を後でどのように使用するかによって異なります。

完全なインターフェイスcollections.ChainMapを提供するために、便宜上 Python 3.3 以降を使用します。MutableMapping古いバージョンの Python で使用する部分のみを実装できます。

于 2013-05-25T03:21:34.293 に答える
3

おそらく、defaultdict役立つだろう

from collections import defaultdict
myDict0= {'1': ('3', '2'), '3': ('2', '1'), '2': ('3', '1')}
myDict2 = {'4': ('5', '2'), '5': ('2', '4'), '2': ('5', '4')}
myDict1 = defaultdict(list)
for (key, value) in myDict0.iteritems():
     myDict1[key].extend(value)

for (key, value) in myDict2.iteritems():
     myDict1[key].extend(value)

print myDict1
defaultdict(<type 'list'>, {'1': ['3', '2'], '3': ['2', '1'], '2': ['3', '1', '5', '4'], '5': ['2', '4'], '4': ['5', '2']})
于 2013-05-25T01:44:55.700 に答える
0

いいえ、それを行う簡単な方法はありません。

最良の方法は、おそらく反復とマージです。何かのようなもの:

for key in myDict1.iterkeys():
    # Thank you to user2246674 and Nolen Royalty to help me optimise this in their comments 
    if key in myDict2:
        myDict2[key] = myDict2[key] + myDict1[key]
    else:
        myDict2[key] = myDict1[key]
于 2013-05-25T01:25:54.950 に答える