J'ai plusieurs paires de dicts/clé-valeur comme ceci:
d1 = {key1: x1, key2: y1}
d2 = {key1: x2, key2: y2}
Je veux que le résultat soit un nouveau dictée (de la manière la plus efficace, si possible):
d = {key1: (x1, x2), key2: (y1, y2)}
En fait, je veux que le résultat d soit:
d = {key1: (x1.x1attrib, x2.x2attrib), key2: (y1.y1attrib, y2.y2attrib)}
Si quelqu'un me montre comment obtenir le premier résultat, je peux trouver le reste.
en supposant que toutes les clés sont toujours présentes dans toutes les cartes:
ds = [d1, d2]
d = {}
for k in d1.iterkeys():
d[k] = Tuple(d[k] for d in ds)
Voici une solution générale permettant de gérer un nombre arbitraire de dictionnaires, avec des cas où les clés ne figurent que dans certains dictionnaires:
from collections import defaultdict
d1 = {1: 2, 3: 4}
d2 = {1: 6, 3: 7}
dd = defaultdict(list)
for d in (d1, d2): # you can list as many input dicts as you want here
for key, value in d.iteritems():
dd[key].append(value)
print(dd)
Spectacles:
defaultdict(<type 'list'>, {1: [2, 6], 3: [4, 7]})
De plus, pour obtenir votre .attrib
, remplacez simplement append(value)
par append(value.attrib)
Si vous avez seulement d1 et d2,
from collections import defaultdict
d = defaultdict(list)
for a, b in d1.items() + d2.items():
d[a].append(b)
Voici une approche que vous pouvez utiliser et qui fonctionnerait même si les deux dictonaires n'avaient pas les mêmes clés:
d1 = {'a':'test','b':'btest','d':'dreg'}
d2 = {'a':'cool','b':'main','c':'clear'}
d = {}
for key in set(d1.keys() + d2.keys()):
try:
d.setdefault(key,[]).append(d1[key])
except KeyError:
pass
try:
d.setdefault(key,[]).append(d2[key])
except KeyError:
pass
print d
Ceci générerait une entrée ci-dessous:
{'a': ['test', 'cool'], 'c': ['clear'], 'b': ['btest', 'main'], 'd': ['dreg']}
Mise à jour Python 3.x
De Eli Bendersky, répondez:
Python 3 supprimé dict.iteritems utilise dict.items à la place. Voir le wiki Python: https://wiki.python.org/moin/Python3.0
from collections import defaultdict
dd = defaultdict(list)
for d in (d1, d2):
for key, value in d.items():
dd[key].append(value)
dict1 = {'m': 2, 'n': 4}
dict2 = {'n': 3, 'm': 1}
Assurez-vous que les clés sont dans le même ordre:
dict2_sorted = {i:dict2[i] for i in dict1.keys()}
keys = dict1.keys()
values = Zip(dict1.values(), dict2_sorted.values())
dictionary = dict(Zip(keys, values))
donne:
{'m': (2, 1), 'n': (4, 3)}
def merge(d1, d2, merge):
result = dict(d1)
for k,v in d2.iteritems():
if k in result:
result[k] = merge(result[k], v)
else:
result[k] = v
return result
d1 = {'a': 1, 'b': 2}
d2 = {'a': 1, 'b': 3, 'c': 2}
print merge(d1, d2, lambda x, y:(x,y))
{'a': (1, 1), 'c': 2, 'b': (2, 3)}