1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| def parcours(d1, d2, NR = 0, aff = 0):
print '\n--- Niveau recursif : ',NR,' -------------------'
print 'id(d1) =',id(d1)
print 'id(d2) =',id(d2),'\n'
for key in d2.keys() :#on met a jour d1 par rapport aux keys de d2
#pour le bon parcours en zip() plus tard
if key not in d1.keys() :
d1[key] = d2.get(key)
for key in d1.keys() :#on met a jour d2 par rapport aux keys de d1
#pour le bon parcours en zip() plus tard
if key not in d2.keys() :
d2[key] = d1.get(key)
A,B = {},{}
for k in d1.iterkeys():
A[k],B[k] = d1[k],d2[k]
print 'id(A) =',id(A)
print 'id(B) =',id(B)
d1,d2 = A,B
print 'id(d1) =',id(d1),' apres synchronisation des cles'
print 'id(d2) =',id(d2),' apres synchronisation des cles'
if aff:
print '-------- entree dans parcours de d1 et d2 --------------------------'
print 'd1 =\n',d1
print 'd2 =\n',d2
print '\nd1.items() =\n',d1.items()
print '\nd2.items() =\n',d2.items()
for (k1, v1),(k2, v2) in zip(d1.items(), d2.items()) :
#on parcourt d1 et d2 en parallele
if aff:
print
print 'k1 : v1 = ',k1,":",v1
print 'k2 : v2 = ',k2,":",v2
if v1 is not v2 :
if isinstance(v1, dict) & isinstance(v2, dict) :
# si v1 et v2 sont differents en tant que dict,
# une recursivite modifiera ces valeurs en tant que clef
# (2eme ligne du code)
print '\nOn repart sur parcours(v1, v2) avec v1 is not v2'
print 'id(v1) =',id(v1)
print 'id(v2) =',id(v2)
d1[k1] = parcours(v1, v2, NR+1)
else :
# on a affaire a au moins une valeur de type different que dict
# (on ira pas plus loin du coup) :
# une liste va imbriquer les deux valeurs
if aff:
print 'zip(d1.items(), d2.items()) =\n',zip(d1.items(), d2.items())
listDic = []
listDic.append(v1)
listDic.append(v2)
d1[k1] = listDic
else :# on parcourt le reste de l'arborescence.
if isinstance(v1, dict) & isinstance(v2, dict) :
if aff:
print '\nOn repart sur parcours(v1, v2) cette fois avec v1 is v2'
parcours(v1, v2)
if aff:
print '\nd1 de sortie =\n',d1
return d1
###########################################################################
c={ 'a':{'b':{'atrae':'MOREc','hihi':'huhu','wert':'wert_c','4f5g':'45_c'}}, 'x':{'coucou':'beu'}, 'y':{'coucou':'beu'} }
d={ 'a':{'b':{'atrae':'MOREd','hihi':['haha','hyhy'],'wert':'wert_d','4f5g':'4f5g_d'}}, 'c':{'u':'v'} }
# On enregistre les valeurs de c['a']['b'] et d['a']['b'] dans une chaine
ecr = "On est parti de:\n\nc['a']['b'] =\n"
for xc in c['a']['b'].items(): ecr += repr(xc)+'\n'
ecr += "\nd['a']['b'] =\n"
for xd in d['a']['b'].items(): ecr += repr(xd)+'\n'
par = parcours(c, d)
print "\nCAS 1 -------------- Fin de l'updating -------------------------\n"
print ecr
print "On obtient c apres updating:\n"
print "par['a']['b'] ="
for xpar in par['a']['b'].items(): print xpar
print
###########################################################################
c={ 'a':{'b':{'atrae':'MOREc','hihi':'huhu','wert':'wert_c','4f5g':'45_c'}}, 'x':{'coucou':'beu'}, 'y':{'coucou':'beu'} }
d={ 'a':{'b':{'hihi':['haha','hyhy'],'wert':'wert_d','atrae':'MOREd','4f5g':'4f5g_d'}}, 'c':{'u':'v'} }
# On enregistre les valeurs de c['a']['b'] et d['a']['b'] dans une chaine
ecr = "On est parti de:\n\nc['a']['b'] =\n"
for xc in c['a']['b'].items(): ecr += repr(xc)+'\n'
ecr += "\nd['a']['b'] =\n"
for xd in d['a']['b'].items(): ecr += repr(xd)+'\n'
par = parcours(c, d)
print "\nCAS 2 -------------- Fin de l'updating -------------------------\n"
print ecr
print "On obtient c apres updating:\n"
print "par['a']['b'] ="
for xpar in par['a']['b'].items(): print xpar
print |
Partager