2010-11-03 19 views
0

j'ai deux dictionnairescomparant deux listes en python dictionnaire

{key1:[list_of_objects ], {key2:[list_of_objects ]} 

par exemple

dict1 = {key1:['a', 'b', 'c', 'd' ], key2: ['f', 'g', 'h' ] } 
dict2 = {key1:['a', 'b', 'c', 'd'], key2: ['f', 'g', 'h', 'i' ] } 

Pour eack clé dans les deux Dict1 et DICT2, je veux comparer les éléments dans les listes. Par exemple, comparez chaque valeur dans dict1 [key1] avec la valeur correspondante dans dict2 [key1] et ainsi de suite. Les éléments de la liste sont des objets, il en sera runing quelque chose comme

if dict1[key1][0].some_function() = = dict2[key1][0].some_function() 
    then condition 

ce qui est le meilleur moyen d'exécuter cette comparaison?

+2

avez-vous un moyen de travail pour le faire? Une fois que vous faites, il sera temps de s'inquiéter de la vitesse. – SilentGhost

+0

Que voulez-vous faire avec 'i' dans dict2 [key2]? Il n'a pas de valeur correspondante dans dict1. –

+0

Vous ne savez pas exactement ce que vous voulez faire. Je suppose que vous avez une classe MyClass qui a une fonction membre some_function qui calcule un nombre (ou autre comparable) qui peut être comparé par ==. Maintenant, voulez-vous faire quelque chose à chaque match sans vous soucier de l'ordre dans la liste? Si dict1 ['key1'] = [A, B, C] et dict2 ['key1'] = [B, C, A] devrait-il trouver des correspondances? (Sans doute non, puisque les listes ne sont pas alignées). Avez-vous besoin de tous les objets des clés de liste avant de faire quelque chose? Voulez-vous parcourir toutes les clés ou simplement comparer key1? –

Répondre

0
for key in dict1.keys(): 
    for a,b in zip(dict1[key],dict2[key]): 
     if a.some_function() == b.some_function(): 
      #do something 

Si vos listes sont très longues, vous pouvez échanger zip pour izip de collections.

+0

Cela fonctionne réellement assumming les entrées dans les listes sont ordonnées et égales en longueur. – json

+0

@json Si elles ne sont pas de la même longueur, vous n'avez rien à comparer. Ou aviez-vous l'intention de lancer une action lorsque les articles étaient différents plutôt que juste quand ils étaient identiques? –

+0

comparer, des articles similaires et de se connecter ceux qui ne sont pas dans les deux listes - mais ce qui précède a fonctionné pour moi, je viens d'ajouter une vérification pour s'assurer que les listes sont la même longueur. – json

0

ensembles rendent facile:

for key in dict1.keys(): 
    diff = set(dict1[key]).symmetric_difference(dict2[key]) 
    if diff: 
     print "%s: %s" % (key, diff) # or do whatever 
+0

Deux problèmes ici. 1. Cela ne couvre pas l'exécution de la méthode 'some_function'. 2. L'OP veut faire quelque chose quand les items sont identiques, pas quand ils sont différents. –

+0

Bons points. Je pense que j'étais confus par l'explication originale du problème du PO et par l'utilisation de chaînes dans l'exemple. – ianmclaury

+0

Puisque l'OP a clarifié plus tard que l'ordre est important, je ne vais pas m'ennuyer à mettre à jour cette solution basée sur les ensembles. – ianmclaury