2010-05-20 6 views
-1

J'ai deux grandes listes remplies de dictionnaires. J'ai besoin de combiner les entrées si une valeur de dict2 == dict1 et place les nouvelles combinaisons à un autre endroit. J'ai du mal à l'expliquer.Combinaison d'entrées, filtrage de dictionnaires Python

Liste une contient:

{'keyword':value, 'keyword2':value2} 

Liste deux:

{'keyword2':value2, 'keyword3':value3} 

Je veux une nouvelle liste avec des dictionnaires, y compris keyword1, keyword2 et mot clé3 si les deux listes partagent la même valeur 'keyword2'. Quelle est la meilleure façon de faire cela? Quand j'essaie, je viens seulement avec des tonnes de boucles imbriquées. Merci

+1

Je pense que vous utilisez langu âge incorrectement. Quelque chose comme '{'k1': 'v1', 'k2': 'v2'}' est un "dictionnaire", pas une liste; un membre individuel comme "k1": "v1" est un "élément" ou "mapping". Pedantic peut-être, mais cela vous rend plus difficile à comprendre. – Etaoin

+0

Que se passe-t-il si les listes ont des valeurs différentes pour la même clé? Lequel gagne? Ou devrait-on supprimer l'entrée ou lancer une exception? –

Répondre

0

Boucle sur un dictionnaire, en comparant des éléments individuels à l'autre dictionnaire. Comme cela, où dict1 et dict2 sont les originaux, et dict3 est le résultat:

dict3 = dict1 
for k in dict2: 
    if k in dict1: 
     # The key is in both dictionaries; we've already added dict1's version 
     if dict1[k] != dict2[k]: 
      pass # The dictionaries have different values; handle this as you like 
    else 
     # The key is only in dict2; add it to dict3 
     dict3[k] = dict2[k] 

Vous n'étiez pas clair sur ce que le comportement que vous vouliez si les deux dictionnaires ont des valeurs différentes pour une clé; remplacer le "passe" avec tout ce que vous voulez faire. (Comme il est écrit, il gardera la valeur de dict1. Si vous ne voulez pas inclure soit la valeur, remplacez le pass avec del dict3[k].)

2

Si vous ne se soucient pas de « conflits », à savoir que la même clé est mis en correspondance avec des valeurs différentes dans deux dicts, vous pouvez utiliser la méthode update de dicts:

>>> d1 = {'keyword': 1, 'keyword2': 2} 
>>> d2 = {'keyword2': 2, 'keyword3': 3} 
>>> d = {} 
>>> d.update(d1) 
>>> d 
{'keyword2': 2, 'keyword': 1} 
>>> d.update(d2) 
>>> d 
{'keyword3': 7, 'keyword2': 2, 'keyword': 1} 

en supposant que vos dicts sont stockés dans une grande liste nommée dict_list:

total = {} 
for d in dict_list: 
    total.update(d) 
+0

OP écrit que seules les valeurs partagées devraient être dans la nouvelle liste, donc il se soucie des conflits - il n'a simplement pas indiqué comment le programme devrait se comporter dans un tel cas. –

Questions connexes