Comparar dos diccionarios y comprobar cuántos pares (clave, valor) son iguales

Resuelto user225312 asked hace 13 años • 29 respuestas

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, valuepar xtiene 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 tuplese 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, valuepares son iguales.

user225312 avatar Dec 25 '10 02:12 user225312
Aceptado

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))
mouad avatar Dec 24 '2010 19:12 mouad
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)
Daniel Myers avatar Sep 17 '2013 22:09 Daniel Myers

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

Jochen Ritzel avatar Dec 24 '2010 19:12 Jochen Ritzel

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 python2y python3.

Pedro Lobito avatar Dec 01 '2016 22:12 Pedro Lobito