12

dict120,000 を超えるキーを持つ python 辞書がupdateあり、別の辞書でそれを使用したいと考えていdict2ます。辞書は次のようになります。

dict1
  key11=>[value11]
  key12=>[value12]
  ...
  ...
  keyxyz=>[value1x]      //common key
  ...... so on

dict2
  key21=>[value21]
  key22=>[value22]
  ...
  ...
  keyxyz=>[value2x]      // common key
  ........ so on

私が使用する場合

dict1.update(dict2)

のキーにdict1似ているのキーdict2は、 の値で上書きされますdict2。私が望むのは、キーが既に dict1 に存在する場合、dict2 のそのキーの値を dict1 の値に追加する必要があるということです。そう

dict1.conditionalUpdate(dict2)

結果として

dict1
  key11=>[value11]
  key12=>[value12]
  key21=>[value21]
  key22=>[value22]
  ...
  ...
  keyxyz=>[value1x,value2x]

素朴な方法はdict2、各キーのキーを反復処理し、キーdict1を挿入または更新します。より良い方法はありますか?Python は、この種の機能をサポートする組み込みのデータ構造をサポートしていますか?

4

3 に答える 3

10

defaultdictコレクションモジュールから使用します。

>>> from collections import defaultdict
>>> dict1 = {1:'a',2:'b',3:'c'}
>>> dict2 = {1:'hello', 4:'four', 5:'five'}
>>> my_dict = defaultdict(list)
>>> for k in dict1:
...    my_dict[k].append(dict1[k])
...
>>> for k in dict2:
...    my_dict[k].append(dict2[k])
...
>>> my_dict[1]
['a', 'hello']
于 2012-05-17T11:55:26.927 に答える
1

これは、辞書内包表記を使用して実際に行うのは非常に簡単ですitertools.groupby()

dict1 = {1: 1, 2: 2, 3: 3, 4: 4}
dict2 = {5: 6, 7: 8, 1: 1, 2: 2}

from itertools import groupby, chain
from operator import itemgetter

sorted_items = sorted(chain(dict1.items(), dict2.items()))

print({key: [value[1] for value in values] for key, values in groupby(sorted_items, itemgetter(0))})

私たちに与えます:

{1: [1, 1], 2: [2, 2], 3: [3], 4: [4], 5: [6], 7: [8]}

当然、これにより新しい dict が作成されますが、最初の dict を更新する必要がある場合は、新しい dict で更新することで簡単に行うことができます。値がすでにリストになっている場合は、多少の変更が必要になる場合があります (ただし、操作のためにそれを行っていると思われますが、その場合は必要ありません)。

当然、Python 2.x を使用している場合は、dict.viewitems()or dict.iteritems()overを使用する必要がありdict.items()ます。dict 内包表記より前のバージョンの Python を使用している場合は、dict((key , value) for ...)代わりに使用できます。

于 2012-05-17T11:54:24.113 に答える
1

通常の Python 辞書だけを使用して、何もインポートしない別の方法:

>>> dict1 = {1:'a',2:'b',3:'c'}
>>> dict2 = {1:'hello', 4:'four', 5:'five'}
>>> for k in dict2:
...  dict1[k] = dict1.get(k,"") + dict2.get(k)
... 
>>> dict1
{1: 'ahello', 2: 'b', 3: 'c', 4: 'four', 5: 'five'}
>>> 

dict1.get(k,"")が存在する場合は に関連付けられた値を返し、k存在しない場合は空の文字列を返し、 の内容を追加しますdict2

于 2017-04-07T00:06:11.443 に答える