Comparar dos diccionarios y comprobar cuántos pares (clave, valor) son iguales
Tengo dos diccionarios, pero para simplificar, tomaré estos dos:
>>> x = dict(a=1, b=2)
>>> y = dict(a=2, b=2)
Ahora quiero comparar si cada key, value
par x
tiene el mismo valor correspondiente en y
. Entonces escribí esto:
>>> for x_values, y_values in zip(x.iteritems(), y.iteritems()):
if x_values == y_values:
print 'Ok', x_values, y_values
else:
print 'Not', x_values, y_values
Y funciona ya que tuple
se devuelve a y luego se compara la igualdad.
Mis preguntas:
¿Es esto correcto? ¿ Hay una mejor manera de hacer esto? Mejor no en velocidad, hablo de elegancia del código.
ACTUALIZACIÓN: Olvidé mencionar que tengo que comprobar cuántos key, value
pares son iguales.
Si quieres saber cuántos valores coinciden en ambos diccionarios, deberías haber dicho eso :)
Quizás algo como esto:
shared_items = {k: x[k] for k in x if k in y and x[k] == y[k]}
print(len(shared_items))
def dict_compare(d1, d2):
d1_keys = set(d1.keys())
d2_keys = set(d2.keys())
shared_keys = d1_keys.intersection(d2_keys)
added = d1_keys - d2_keys
removed = d2_keys - d1_keys
modified = {o : (d1[o], d2[o]) for o in shared_keys if d1[o] != d2[o]}
same = set(o for o in shared_keys if d1[o] == d2[o])
return added, removed, modified, same
x = dict(a=1, b=2)
y = dict(a=2, b=2)
added, removed, modified, same = dict_compare(x, y)
Lo que quieres hacer es simplementex == y
Lo que haces no es una buena idea, porque se supone que los elementos de un diccionario no deben tener ningún orden. Es posible que esté comparando [('a', 1),('b', 1)]
con [('b', 1), ('a', 1)]
(mismos diccionarios, orden diferente).
Por ejemplo, vea esto:
>>> x = dict(a=2, b=2, c=3, d=4)
>>> x
{'a': 2, 'c': 3, 'b': 2, 'd': 4}
>>> y = dict(b=2, c=3, d=4)
>>> y
{'c': 3, 'b': 2, 'd': 4}
>>> zip(x.iteritems(), y.iteritems())
[(('a', 2), ('c', 3)), (('c', 3), ('b', 2)), (('b', 2), ('d', 4))]
La diferencia es solo un elemento, pero su algoritmo verá que todos los elementos son diferentes
dic1 == dic2
De documentos de Python :
Todos los ejemplos siguientes devuelven un diccionario igual a
{"one": 1, "two": 2, "three": 3}
:
>>> a = dict(one=1, two=2, three=3) >>> b = {'one': 1, 'two': 2, 'three': 3} >>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3])) >>> d = dict([('two', 2), ('one', 1), ('three', 3)]) >>> e = dict({'three': 3, 'one': 1, 'two': 2}) >>> a == b == c == d == e True
Proporcionar argumentos de palabras clave como en el primer ejemplo solo funciona para claves que son identificadores válidos de Python. De lo contrario, se puede utilizar cualquier clave válida.
Válido para python2
y python3
.