2013-07-11 128 views
6

相关:Is there any pythonic way to combine two dicts (adding values for keys that appear in both)?Python - 合并两个字典,连接字符串值?

我想合并两个字符串:字符串字典,并连接值。以上帖子建议使用collections.Counter,但它不处理字符串连接。

>>> from collections import Counter 
>>> a = Counter({'foo':'bar', 'baz':'bazbaz'}) 
>>> b = Counter({'foo':'baz'}) 
>>> a + b 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/collections.py", line 569, in __add__ 
TypeError: cannot concatenate 'str' and 'int' objects 

(我的猜测是柜台尝试设置b['baz'] 0)

我想获得的{'foo':'barbaz', 'baz':'bazbaz'}结果。连接顺序对我无关紧要。什么是干净的,Pythonic的方式来做到这一点?

+0

如果第二个字典看起来如此,预期的输出是什么:'{'foo':'baz','spam':'eggs'}'? –

+0

@AshwiniChaudhary {'foo':'barbaz','baz':'bazbaz','spam':'eggs'} – jbreed

回答

14

快译通-理解:

>>> d = {'foo': 'bar', 'baz': 'bazbaz'} 
>>> d1 = {'foo': 'baz'} 
>>> keys = d.viewkeys() | d1.viewkeys() 
>>> {k : d.get(k, '') + d1.get(k, '') for k in keys} 
{'foo': 'barbaz', 'baz': 'bazbaz'} 

对于Python 2.6和更早的版本:

>>> dict((k, d.get(k, '') + d1.get(k, '')) for k in keys) 
{'foo': 'barbaz', 'baz': 'bazbaz'} 

这适用于任何数量的类型的字典的工作:

def func(*dicts): 
    keys = set().union(*dicts) 
    return {k: "".join(dic.get(k, '') for dic in dicts) for k in keys} 
... 
>>> d = {'foo': 'bar', 'baz': 'bazbaz'} 
>>> d1 = {'foo': 'baz','spam': 'eggs'} 
>>> d2 = {'foo': 'foofoo', 'spam': 'bar'} 
>>> func(d, d1, d2) 
{'foo': 'barbazfoofoo', 'baz': 'bazbaz', 'spam': 'eggsbar'} 
+0

字典理解,这是我听到的第一个,但听起来真棒! – 2013-07-11 23:56:47

0

可以写一个通用的帮手,如:

a = {'foo':'bar', 'baz':'bazbaz'} 
b = {'foo':'baz'} 

def concatd(*dicts): 
    if not dicts: 
     return {} # or should this be None or an exception? 
    fst = dicts[0] 
    return {k: ''.join(d.get(k, '') for d in dicts) for k in fst} 

print concatd(a, b) 
# {'foo': 'barbaz', 'baz': 'bazbaz'} 

c = {'foo': '**not more foo!**'} 
print concatd(a, b, c) 
# {'foo': 'barbaz**not more foo!**', 'baz': 'bazbaz'}