【问题标题】:insert or update keys in a python dictionary在 python 字典中插入或更新键
【发布时间】:2012-05-17 11:40:58
【问题描述】:

我有一个 python 字典 dict1 有超过 20,000 个键,我想用另一个字典 dict2 update 它。字典如下所示:

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 是否支持支持这种功能的内置数据结构?

【问题讨论】:

标签: python algorithm dictionary


【解决方案1】:

使用集合模块中的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']

【讨论】:

【解决方案2】:

这实际上很简单,使用 dict comprehension 和 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()。如果您使用的是 dict 理解之前的 Python 版本,那么您可以改用 dict((key , value) for ...)

【讨论】:

    【解决方案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的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 2021-10-16
      相关资源
      最近更新 更多