2013-07-11 9 views
6

संबंधित: Is there any pythonic way to combine two dicts (adding values for keys that appear in both)?पायथन - दो शब्दकोशों को संयोजित करें, स्ट्रिंग मानों को संयोजित करें?

मैं दो स्ट्रिंग मर्ज करना चाहता हूं: स्ट्रिंग शब्दकोश, और मानों को जोड़ना। उपरोक्त पोस्ट 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 

मैं {'foo':'barbaz', 'baz':'bazbaz'} का एक परिणाम प्राप्त करना चाहते हैं (मेरा अनुमान काउंटर स्थापित करने के लिए b['baz'] 0. करने की कोशिश करता है)। Concatenation आदेश मुझसे कोई फर्क नहीं पड़ता। ऐसा करने के लिए एक साफ, पायथनिक तरीका क्या है?

+0

दूसरा निर्देश दिखने पर अपेक्षित आउटपुट क्या होगा: '{'foo': 'baz', 'स्पैम': 'अंडे'}'? –

+0

@ अश्विनी चौधरी {'foo': 'barbaz', 'baz': 'bazbaz', 'स्पैम': 'अंडे'} – jbreed

उत्तर

14

Dict-समझ:

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

अजगर 2.6 के लिए और पूर्ववर्ती संस्करण:

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

यह dicts के किसी भी संख्या के लिए काम करेंगे:

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

शब्दकोश समझ, यह मैंने पहले सुना है, लेकिन यह बहुत अच्छा लगता है! –

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'} 
संबंधित मुद्दे