2013-07-11 27 views
6

correlati: Is there any pythonic way to combine two dicts (adding values for keys that appear in both)?Python - Combina due dizionari, concatena i valori stringa?

mi piacerebbe unire due stringhe: dizionari di stringa, e concatenare i valori. Sopra la posta raccomandata di utilizzare collections.Counter, ma non gestisce la concatenazione di stringhe.

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

(La mia ipotesi è Contatore tenta di impostare b['baz'] a 0.)

mi piacerebbe ottenere un risultato di {'foo':'barbaz', 'baz':'bazbaz'}. L'ordine di concatenazione non ha importanza per me. Qual è un modo pulito, pitonico per farlo?

+0

Quale sarà l'output previsto se appare il secondo dict: '{'foo': 'baz', 'spam': 'eggs'}'? –

+0

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

risposta

14

Dict-comprensione:

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

Per Python 2.6 e precedenti:

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

Questo funziona per qualsiasi numero di 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

Comprensione del dizionario, questo è il primo che ho sentito di questo, ma suona fantastico! –

0

possibile scrivere un aiutante generica, come ad esempio:

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