在python字典中插入或更新键

2024-10-05 14:26:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python字典dict1有超过20000个键,我想用另一个字典dict2update。字典看起来是这样的:

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)

然后,与dict2键类似的dict1键的值将被dict2的值覆盖。我想要的是,如果dict1中已经存在一个键,那么dict2中该键的值应该附加到dict1的值。所以

dict1.conditionalUpdate(dict2)

会导致

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

一个简单的方法是对dict1的每个键在dict2的键上迭代,并插入或更新键。有更好的方法吗?python是否支持支持这种功能的内置数据结构?


Tags: key字典soonupdatecommondict1dict2
3条回答

另一个没有导入任何内容的方法,只是使用常规的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的内容。

实际上,使用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]}

当然,这会创建一个新的dict,但是如果您需要来更新第一个dict,您可以使用新的dict进行简单的更新。如果您的值已经是列表,这可能需要一些小的修改(但我认为您这样做是为了操作,在这种情况下,没有必要)。

当然,如果您使用的是Python 2.x,那么您需要在dict.items()上使用dict.viewitems()dict.iteritems()。如果在dict理解之前使用的是Python版本,那么可以使用dict((key , value) for ...)

使用集合模块中的^{}

>>> 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']

相关问题 更多 >