12

我有一个dict1包含 20,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

使用 dict 理解实际上很简单,并且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]}

自然,这会创建一个新的字典,但是如果您需要更新第一个字典,您可以通过更新新的字典来轻松完成。如果您的值已经是列表,则可能需要进行一些小的修改(但我认为您这样做是为了操作,在这种情况下,没有必要)。

自然,如果您使用的是 Python 2.x,那么您将需要使用dict.viewitems()dict.iteritems()超过dict.items(). 如果您在字典推导之前使用的是 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 回答