2016-11-10 1 views
1

Je voudrais ajouter deux OrderedDict objets comme ceux-ci:Comment ajouter les valeurs de deux objets OrderedDict dans python, en gardant l'ordre?

dict1 = OrderedDict([('Table', [10, 20, 30, 'wood']), ('Chair', [200, 300, 400, 'wood'])]) 
dict2 = OrderedDict([('Table', ['red', 55]), ('Chair', ['blue', 200])]) 

Et créer un nouveau OrderedDict comme celui-ci (l'ordre est important):

dict3 = OrderedDict([('Table', [10, 20, 30, 'wood', 'red', 55]), ('Chair', [200, 300, 400, 'wood', 'blue', 200])]) 

S'il y a des clés dans dict1 ou dict2 qui ne sont pas présents dans l'autre, ceux-ci doivent être ignorés, seules les clés correspondantes doivent être utilisées pour la sortie. Toutes les valeurs sont des listes.

+0

Et vous voulez avoir un dictionnaire ** nouveau ** en sortie, non? Ne pas mettre à jour les listes dans 'dict1' ou' dict2'. –

+0

En fait, la mise à jour de l'un des dicts fonctionnerait aussi bien. –

+0

J'ai nettoyé votre question et ajouté une hypothèse supplémentaire: que toutes les valeurs sont des listes. –

Répondre

4

Parce que vous voulez préserver l'ordre de vos objets OrderedDict, vous devez faire une boucle sur un et tester chaque clé contre l'autre pour produire l'union des deux ensembles principaux:

dict3 = OrderedDict((k, dict1[k] + dict2[k]) for k in dict1 if k in dict2) 

bouclez dict1 assure que nous produisons des clés pour le nouveau dictionnaire dans le même ordre, tester avec k in dict2 garantit que nous n'utilisons que les clés qui sont présentes dans les deux mappages d'entrée.

Vous pouvez également mettre à jour dict1 en place avec list.extend():

for key, value in dict1.items(): 
    if key in dict2: 
     value.extend(dict2[key]) 

Démo:

>>> from collections import OrderedDict 
>>> dict1 = OrderedDict([('Table', [10, 20, 30, 'wood']), ('Chair', [200, 300, 400, 'wood'])]) 
>>> dict2 = OrderedDict([('Table', ['red', 55]), ('Chair', ['blue', 200])]) 
>>> OrderedDict((k, dict1[k] + dict2[k]) for k in dict1 if k in dict2) 
OrderedDict([('Table', [10, 20, 30, 'wood', 'red', 55]), ('Chair', [200, 300, 400, 'wood', 'blue', 200])]) 
+0

Cela a fonctionné exactement comme j'avais besoin! Merci beaucoup Martijn! –

0
dict3 = {} 
for i in dict1: 
    if i in dict2: 
     dict3[i]=[] 
     for j in dict1[i]: 
      dict3[i].append(j) 
     for j in dict2[i]: 
      dict3[i].append(j) 
+0

Notez que puisque vous utilisez simplement un dict, la commande n'est pas garantie. –

+0

Puisqu'il itère sur les éléments de 'dict1' d'abord et ensuite sur' dict2', je pense que toutes les valeurs d'une clé particulière seront dans l'ordre. Faites-moi savoir si j'ai tort de le penser. :) –

+0

Cela dépend de la façon dont vous interprétez "garder la commande". Du fait que le code original utilisait OrderedDicts, je pense que l'exigence était de commander des clés et des valeurs. –