2009-08-31 9 views
2

j'ai deux dictionnaires de la structure suivante:Trouver la différence situé entre deux dictionnaires complexes

a) dict1 = {'a':[ [1,2], [3,4] ], 'b':[ [1,2],[5,6] ]} 
b) dict2 = {'a':[ [1,2], [5,6] ], 'b':[ [1,2],[7,8] ]} 

Je dois trouver la différence de jeu entre chaque clé dans le dictionnaire c.-à-Dict1 [ « a »] - DICT2 [ 'a'] devrait retourner [3,4]. Toute pensée est appréciée.

+0

Que faut-il pour 'Dict1 = { 'c': [[1, 2], [3, 4]]}; dict2 = {'c': [[5, 6], [7, 8]]} '? –

+0

Il devrait retourner dict1 ['c'] = [[1,2], [3,4]] – Prabhu

Répondre

2

Vous avez la mauvaise structure de données pour ce que vous essayez de faire.

Utilisez ceci à la place.

dict1 = {'a': [(1, 2), (3, 4)], 'b': [(1, 2), (5, 6)]} 
dict2 = {'a': [(1, 2), (5, 6)], 'b': [(1, 2), (7, 8)]} 

La vie est plus simple lorsque vous essayez de définir des opérations sur des objets immuables tels que des tuples.

Cela transformera votre liste de listes en une liste de tuples.

>>> dict((key,[tuple(v) for v in dict1[key]]) for key in dict1) 
{'a': [(1, 2), (3, 4)], 'b': [(1, 2), (5, 6)]} 

Voici la solution complète.

>>> dict1t= dict((key,[tuple(v) for v in dict1[key]]) for key in dict1) 
>>> dict2t= dict((key,[tuple(v) for v in dict2[key]]) for key in dict2) 
>>> set(dict1t['a'])-set(dict2t['a']) 
set([(3, 4)]) 
6

L'utilisation d'éléments mutables (tels que des listes) rend le problème BEAUCOUP plus difficile, car il empêche l'utilisation simple de la structure de données set de Python. Il peut être intéressant de réaliser des copies temporaires/versions qui fait utilisent tuples au lieu de ces listes embêtants:

def tempaux(d): 
    return dict((k, set(tuple(x) for x in v)) 
       for k, v in d.iteritems()) 

maintenant:

def thedifs(dd1, dd2) 
    d1 = tempaux(dd1) 
    d2 = tempaux(dd2) 
    allkeys = set(d1).update(d2) 
    empty = set() 
    difs = [] 
    for k in allkeys: 
    s1 = d1.get(k, empty) 
    s2 = d2.get(k, empty) 
    adif = s1 - s2 
    if adif: difs.append(adif) 
    return difs 

Cela suppose la différence de jeu réelle plutôt que la différence symétrique etc. Vous pouvez bien bien sûr retourner les tuples dans les listes avant les retours, & c, en fonction de vos besoins exacts.

3
>>> s1 = set([(1,2), (3,4)]) 
>>> s2 = set([(1,2), (5,6)]) 
>>> s1 - s2 
{(3, 4)} 
2

applicable à la liste ou dict ou numéro a et b partagent la même structure

c={'a':'1','b':'2'} 
d={'a':'10','b':'20'} 
e={'x':c,'t':15} 
f={'x':d,'t':19} 

def diff(a,b): 
    if isinstance(a, int) and isinstance(b, int): 
     b = b - a 
     return b 
    if isinstance(a, str) and isinstance(b, str): 
     if a.isdigit() and b.isdigit(): 
      b = str(int(b) - int(a)) 
      return b 
     else: 
      b = a 
      return b 
    if type(a) is list and type(b) is list: 
     for i in range(len(a)): 
      b[i] = diff(a[i],b[i]) 
     return b 
    if type(a) is dict and type(b) is dict: 
     for k,v in b.iteritems(): 
      b[k] = diff(a[k],b[k]) 
     return b 

print diff(e,f) 
Questions connexes