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

defaultdict を使用します。

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

ただし、後者の形式はお勧めしません。一般に、辞書のすべてのキー/値を同じように保つことは良い考えだと思います(少なくとも、この質問と同じようにすべての項目を扱いたい場合)。つまり、1 つの値がリストの場合、それらすべてをリストにすることをお勧めします。

あなたが本当に物事をこのように保つことを主張するなら:

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 に答える