1

如果 a 和 b 是 2 个字典:

a = {'UK':'http://www.uk.com', 'COM':['http://www.uk.com','http://www.michaeljackson.com']}



bb = {'Australia': 'http://www.australia.com', 'COM':['http://www.Australia.com', 'http://www.rafaelnadal.com','http://www.rogerfederer.com']}

我想合并它们以获得

{'Australia': ['http://www.australia.com'], 'COM': ['http://www.uk.com', 'http://www.michaeljackson.com', 'http://www.Australia.com', 'http://www.rafaelnadal.com', 'http://www.rogerfederer.com'], 'UK': ['http://www.uk.com']}

我想联合他们,即

如何在 Python 中做到这一点而不覆盖和替换任何值?

4

1 回答 1

3

使用默认字典:

from collections import defaultdict
d  = defaultdict(list)

for dd in (a,bb):
    for k,v in dd.items():
        #Added this check to make extending work for cases where 
        #the value is a string.
        v = (v,) if isinstance(v,basestring) else v  #basestring is just str in py3k.
        d[k].extend(v)

(但这几乎是我在之前的回答中告诉你的)

如果您的输入字典看起来像,这现在可以工作

{'Australia':['http://www.australia.com']}

或喜欢:

{'Australia':'http://www.australia.com'}

但是,我建议不要使用后一种形式。一般来说,我认为保持字典的所有键/值看起来相同是一个好主意(至少如果你想将所有项目与这个问题中的所有项目相同)。这意味着,如果一个值是一个列表,那么将它们全部作为一个列表是一个好主意。

如果你真的坚持这样保持:

d = {}
for dd in (a,b):
   for k,v in dd.items():
       if(not isinstance(v,list)):
          v = [v]
       try:
          d[k].extend(v)
       except KeyError: #no key, no problem, just add it to the dict.
          d[k] = v
于 2012-09-12T18:57:36.867 回答