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 desde un tuple
se devuelve a y luego se compara para la igualdad.
Mis preguntas:
¿Es esto correcto? ¿Hay un mejor manera de hacer esto? Mejor no en velocidad, estoy hablando de la elegancia del código.
ACTUALIZACIÓN: Olvidé mencionar que tengo que verificar cuántos key, value
pares son iguales.
python
dictionary
comparison
usuario225312
fuente
fuente
x == y
debe ser cierto de acuerdo con stackoverflow.com/a/5635309/186202Respuestas:
Si desea saber cuántos valores coinciden en ambos diccionarios, debería haber dicho que :)
Tal vez algo como esto:
fuente
list
clave en primer lugar.x = {[1,2]: 2}
fallará. La pregunta ya tiene validezdicts
.list
claves no es un código válido de python: las claves dict deben ser inmutables. Por lo tanto, no estás comparando diccionarios. Si intenta usar una lista como clave de diccionario, su código no se ejecutará. No tienes objetos para comparar. Esto es como escribir yx = dict(23\;dfg&^*$^%$^$%^)
luego quejarse de que la comparación no funciona con el diccionario. Por supuesto que no funcionará. El comentario de Tim, por otro lado, es sobre mutablevalues
, de ahí que haya dicho que estos son problemas diferentes.set
requiere que los valores sean hashaable ydict
requiere que las claves sean hashaable.set(x.keys())
siempre funcionará porque las claves deben ser hashaable, peroset(x.values())
fallarán en los valores que no son hashaable.Lo que quieres hacer es simplemente
x==y
Lo que haces no es una buena idea, porque no se supone que los elementos de un diccionario tengan ningún orden. Es posible que esté comparando
[('a',1),('b',1)]
con[('b',1), ('a',1)]
(mismos diccionarios, diferente orden).Por ejemplo, mira esto:
La diferencia es solo un elemento, pero su algoritmo verá que todos los elementos son diferentes
fuente
fuente
DataFrame
s por diseño no permiten comparaciones verdaderas (a menos que tenga una longitud de 1) ya que heredan denumpy.ndarray
. -crédito para stackoverflow.com/a/33307396/994076dic1 == dic2
De documentos de Python :
Válido para ambos
py2
ypy3
.fuente
OrderedDict != dict
Soy nuevo en Python pero terminé haciendo algo similar a @mouad
El operador XOR (
^
) debe eliminar todos los elementos del dict cuando son iguales en ambos dictados.fuente
{'a':{'b':1}}
daTypeError: unhashable type: 'dict'
)Como parece que nadie mencionó
deepdiff
, lo agregaré aquí para completar. Me resulta muy conveniente para obtener diff de objetos (anidados) en general:Instalación
Código de muestra
Salida
Nota sobre la impresión bonita del resultado para la inspección: el código anterior funciona si ambos dictos tienen las mismas claves de atributo (posiblemente con valores de atributo diferentes como en el ejemplo). Sin embargo, si un
"extra"
atributo está presente es uno de los dictados,json.dumps()
falla conSolución: use
diff.to_json()
yjson.loads()
/json.dumps()
para imprimir bonito:Salida:
Alternativa: uso
pprint
, resultados en un formato diferente:Salida:
fuente
Solo usa:
fuente
dict1 == dict2
cmp
incorporado se ha eliminado (y debe tratarse como eliminado antes . Una alternativa que proponen:(a > b) - (a < b) == cmp(a, b)
para un equivalente funcional (o mejor__eq__
y__hash__
)TypeError
:unorderable types: dict() < dict()
La respuesta de @mouad es agradable si asume que ambos diccionarios contienen solo valores simples. Sin embargo, si tiene diccionarios que contienen diccionarios, obtendrá una excepción, ya que los diccionarios no se pueden compartir.
Fuera de mi cabeza, algo como esto podría funcionar:
fuente
not isinstance(dict1, dict)
lugar detype(dict1) is not dict
, esto funcionará en otras clases basadas endict. Also, instead of
(dict1 [clave] == dict2 [clave]), you can do
all (atleast_1d (dict1 [clave] == dict2 [clave])) `para manejar matrices al menos.for loop
tan pronto como sedicts_are_equal
vuelva falso. No hay necesidad de continuar más.Otra posibilidad más, hasta la última nota del OP, es comparar los hashes (
SHA
oMD
) de los dictados descargados como JSON. La forma en que se construyen los hashes garantiza que si son iguales, las cadenas de origen también lo son. Esto es muy rápido y matemáticamente sólido.fuente
json.dumps(d, sort_keys=True)
le dará JSON canónico para que pueda estar seguro de que ambos dict son equivalentes. También depende de lo que intentes lograr. Tan pronto como el valor no sea JSON serizalizable, fallará. Para quienes dicen que es ineficiente, echen un vistazo al proyecto ujson.La función está bien IMO, clara e intuitiva. Pero solo para darle (otra) respuesta, aquí está mi ir:
Puede ser útil para usted o para cualquier otra persona.
EDITAR:
He creado una versión recursiva de la anterior. No he visto eso en las otras respuestas.
fuente
Para probar si dos dictos son iguales en claves y valores:
Si desea devolver los valores que difieren, escríbalo de manera diferente:
Tendrías que llamarlo dos veces, es decir
fuente
Código
Prueba
fuente
Una simple comparación con == debería ser suficiente hoy en día (python 3.8). Incluso cuando compara los mismos dictados en un orden diferente (último ejemplo). Lo mejor es que no necesita un paquete de terceros para lograr esto.
fuente
¡Llegar tarde en mi respuesta es mejor que nunca!
Compare Not_Equal es más eficiente que comparar Equal. Como tales dos dictos no son iguales si alguno de los valores clave en un dict no se encuentra en el otro dict. El siguiente código tiene en cuenta que tal vez esté comparando dict por defecto y por lo tanto usa get en lugar de getitem [].
Usar un tipo de valor aleatorio como predeterminado en la llamada get igual a la clave que se está recuperando, en caso de que los dictados tengan un valor None como valor en un dict y esa clave no exista en el otro. Además, la condición get! = Se verifica antes de que no esté en condiciones de eficiencia porque está haciendo la verificación de las claves y los valores de ambos lados al mismo tiempo.
fuente
Estoy usando esta solución que funciona perfectamente para mí en Python 3
Compara dict, list y cualquier otro tipo que implemente el operador "==" por sí mismo. Si necesita comparar algo diferente, debe agregar una nueva rama en el "árbol de if".
Espero que ayude.
fuente
para python3:
fuente
Aquí hay otra opción:
Entonces, como ves, las dos identificaciones son diferentes. Pero los operadores de comparación ricos parecen hacer el truco:
fuente
En PyUnit hay un método que compara los diccionarios maravillosamente. Lo probé usando los siguientes dos diccionarios, y hace exactamente lo que estás buscando.
No recomiendo importar
unittest
a su código de producción. Mi pensamiento es que la fuente en PyUnit podría modificarse para ejecutarse en producción. Utilizapprint
qué "impresiones bonitas" los diccionarios. Parece bastante fácil adaptar este código para que esté "listo para la producción".fuente
ver objetos de vista de diccionario: https://docs.python.org/2/library/stdtypes.html#dict
De esta forma, puede restar dictView2 de dictView1 y devolverá un conjunto de pares clave / valor que son diferentes en dictView2:
Puede intersectar, unir, diferenciar (se muestra arriba), diferencia simétrica de estos objetos de vista de diccionario.
¿Mejor? ¿Más rápido? - no estoy seguro, pero es parte de la biblioteca estándar, lo que lo convierte en una gran ventaja para la portabilidad
fuente
El siguiente código lo ayudará a comparar la lista de dict en python
fuente
fuente
En Python 3.6, se puede hacer como: -
La variable ret será verdadera si todos los elementos de dict_1 están presentes en dict_2
fuente
Aquí está mi respuesta, use una forma recursiva:
¡Espero que ayude!
fuente
¿Por qué no simplemente recorrer un diccionario y verificar el otro en el proceso (suponiendo que ambos diccionarios tengan las mismas claves)?
Salida:
fuente
La forma más fácil (y una de las más sólidas) de hacer una comparación profunda de dos diccionarios es serializarlos en formato JSON, ordenar las claves y comparar los resultados de la cadena:
fuente
fuente
json.dumps
es determinista con la configuración predeterminada).