J'ai deux dictionnaires, mais pour simplifier, je prendrai ces deux:
>>> x = dict(a=1, b=2)
>>> y = dict(a=2, b=2)
Maintenant, je veux comparer si chaque key, value
paire x
a la même valeur correspondante y
. J'ai donc écrit ceci:
>>> 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
Et cela fonctionne car a tuple
est retourné puis comparé pour l'égalité.
Mes questions:
Est-ce correct? Existe-t-il une meilleure façon de procéder? Mieux vaut pas en vitesse, je parle d'élégance du code.
MISE À JOUR: J'ai oublié de mentionner que je dois vérifier combien de key, value
paires sont égales.
python
dictionary
comparison
user225312
la source
la source
x == y
devrait être vrai selon stackoverflow.com/a/5635309/186202Réponses:
Si vous voulez savoir combien de valeurs correspondent dans les deux dictionnaires, vous auriez dû le dire :)
Peut-être quelque chose comme ça:
la source
list
clé en premier lieu.x = {[1,2]: 2}
échouera. La question est déjà valabledicts
.list
clés n'est pas un code python valide - les clés du dict doivent être immuables. Par conséquent, vous ne comparez pas les dictionnaires. Si vous essayez d'utiliser une liste comme clé de dictionnaire, votre code ne s'exécutera pas. Vous n'avez aucun objet à comparer. C'est comme taperx = dict(23\;dfg&^*$^%$^$%^)
puis se plaindre du fait que la comparaison ne fonctionne pas avec le dictionnaire. Bien sûr, cela ne fonctionnera pas. Le commentaire de Tim, d'autre part, concerne les mutablesvalues
, d'où la raison pour laquelle j'ai dit que ce sont des questions différentes.set
nécessite que les valeurs soient lavables etdict
que les clés soient lavables.set(x.keys())
fonctionnera toujours car les clés doivent être lavables, maisset(x.values())
échouera sur les valeurs qui ne sont pas lavables.Ce que vous voulez faire, c'est simplement
x==y
Ce que vous faites n'est pas une bonne idée, car les éléments d'un dictionnaire ne sont pas censés avoir d'ordre. Vous pourriez comparer
[('a',1),('b',1)]
avec[('b',1), ('a',1)]
(mêmes dictionnaires, ordre différent).Par exemple, voyez ceci:
La différence n'est qu'un élément, mais votre algorithme verra que tous les éléments sont différents
la source
la source
DataFrame
s par conception ne permet pas de comparaisons véridiques (sauf s'il a une longueur de 1) car ils héritent denumpy.ndarray
. -credit à stackoverflow.com/a/33307396/994076dic1 == dic2
Depuis les documents python :
Valable pour
py2
etpy3
.la source
OrderedDict != dict
Je suis nouveau sur python mais j'ai fini par faire quelque chose de similaire à @mouad
L'opérateur XOR (
^
) doit éliminer tous les éléments du dict lorsqu'ils sont identiques dans les deux dict.la source
{'a':{'b':1}}
donneTypeError: unhashable type: 'dict'
)Puisqu'il semble que personne n'a mentionné
deepdiff
, je vais l'ajouter ici pour être complet. Je trouve cela très pratique pour obtenir des objets différents (imbriqués) en général:Installation
Exemple de code
Production
Remarque sur l'impression du résultat pour inspection: le code ci-dessus fonctionne si les deux dict ont les mêmes clés d'attribut (avec éventuellement des valeurs d'attribut différentes comme dans l'exemple). Cependant, si un
"extra"
attribut est présent est l'un des dict,json.dumps()
échoue avecSolution: utilisez
diff.to_json()
etjson.loads()
/json.dumps()
pour joliment imprimer:Production:
Alternative: utilisation
pprint
, entraîne une mise en forme différente:Production:
la source
Utilisez simplement:
la source
dict1 == dict2
cmp
intégré a été supprimé (et devrait être traité comme supprimé auparavant . Une alternative qu'ils proposent:(a > b) - (a < b) == cmp(a, b)
pour un équivalent fonctionnel (ou mieux__eq__
et__hash__
)TypeError
:unorderable types: dict() < dict()
La réponse de @mouad est intéressante si vous supposez que les deux dictionnaires contiennent uniquement des valeurs simples. Cependant, si vous avez des dictionnaires qui contiennent des dictionnaires, vous obtiendrez une exception car les dictionnaires ne sont pas hachables.
Du haut de ma tête, quelque chose comme ça pourrait fonctionner:
la source
not isinstance(dict1, dict)
place detype(dict1) is not dict
, cela fonctionnera sur d'autres classes basées surdict. Also, instead of
(dict1 [key] == dict2 [key]), you can do
all (atleast_1d (dict1 [key] == dict2 [key])) `pour gérer au moins les tableaux.for loop
dès que votredicts_are_equal
deviendrait faux. Il n'est pas nécessaire de continuer plus loin.Encore une autre possibilité, jusqu'à la dernière note de l'OP, est de comparer les hachages (
SHA
ouMD
) des dicts sous JSON. La façon dont les hachages sont construits garantit que s'ils sont égaux, les chaînes source sont également égales. C'est très rapide et mathématiquement valable.la source
json.dumps(d, sort_keys=True)
vous donnera un JSON canonique afin que vous puissiez être certain que les deux dict sont équivalents. Cela dépend aussi de ce que vous essayez d'atteindre. Dès que la valeur n'est pas sérialisable JSON, elle échouera. Pour ceux qui disent qu'il est inefficace, jetez un œil au projet ujson.La fonction est fine IMO, claire et intuitive. Mais juste pour vous donner une (autre) réponse, voici mon tour:
Peut être utile pour vous ou pour quelqu'un d'autre ..
ÉDITER:
J'ai créé une version récursive de celle ci-dessus .. Je n'ai pas vu cela dans les autres réponses
la source
Pour tester si deux dict sont égaux en clés et en valeurs:
Si vous souhaitez renvoyer les valeurs qui diffèrent, écrivez-le différemment:
Il faudrait l'appeler deux fois, c'est-à-dire
la source
Code
Tester
la source
Une simple comparaison avec == devrait suffire de nos jours (python 3.8). Même lorsque vous comparez les mêmes dictés dans un ordre différent (dernier exemple). La meilleure chose est que vous n'avez pas besoin d'un package tiers pour accomplir cela.
la source
Être en retard dans ma réponse est mieux que jamais!
Comparer Not_Equal est plus efficace que comparer Equal. En tant que tels, deux dicts ne sont pas égaux si aucune valeur clé dans un dict n'est trouvée dans l'autre dict. Le code ci-dessous prend en compte que vous comparez peut-être dict par défaut et utilise donc get au lieu de getitem [].
Utiliser une sorte de valeur aléatoire par défaut dans l'appel get égale à la clé récupérée - juste au cas où les dicts ont une valeur None comme valeur dans un dict et que cette clé n'existe pas dans l'autre. De plus, la condition get! = Est vérifiée avant la condition non en état d'efficacité, car vous effectuez la vérification des clés et des valeurs des deux côtés en même temps.
la source
J'utilise cette solution qui fonctionne parfaitement pour moi en Python 3
Il compare dict, list et tout autre type qui implémente l'opérateur "==" par lui-même. Si vous avez besoin de comparer autre chose, vous devez ajouter une nouvelle branche dans l'arborescence "if".
J'espère que cela pourra aider.
la source
pour python3:
la source
Voici une autre option:
Donc, comme vous le voyez, les deux identifiants sont différents. Mais les opérateurs de comparaison riches semblent faire l'affaire:
la source
Dans PyUnit, il existe une méthode qui compare magnifiquement les dictionnaires. Je l'ai testé en utilisant les deux dictionnaires suivants, et il fait exactement ce que vous recherchez.
Je ne recommande pas d'importer
unittest
dans votre code de production. Ma pensée est que la source dans PyUnit pourrait être ré-outillée pour fonctionner en production. Il utilisepprint
qui "joliment imprime" les dictionnaires. Il semble assez facile d'adapter ce code pour qu'il soit "prêt pour la production".la source
voir les objets de vue du dictionnaire: https://docs.python.org/2/library/stdtypes.html#dict
De cette façon, vous pouvez soustraire dictView2 de dictView1 et il retournera un ensemble de paires clé / valeur qui sont différentes dans dictView2:
Vous pouvez intersecter, réunir, différencier (voir ci-dessus), différence symétrique ces objets de vue de dictionnaire.
Mieux? Plus rapide? - pas sûr, mais faisant partie de la bibliothèque standard - ce qui en fait un gros plus pour la portabilité
la source
Le code ci-dessous vous aidera à comparer la liste des dict en python
la source
la source
En Python 3.6, cela peut être fait comme: -
La variable ret sera vraie si tous les éléments de dict_1 sont présents dans dict_2
la source
Voici ma réponse, utilisez une méthode récursive:
J'espère que cela pourra aider!
la source
Pourquoi ne pas simplement parcourir un dictionnaire et vérifier l'autre dans le processus (en supposant que les deux dictionnaires ont les mêmes clés)?
Production:
la source
La façon la plus simple (et l'une des plus robustes) de comparer en profondeur deux dictionnaires consiste à les sérialiser au format JSON, à trier les clés et à comparer les résultats de la chaîne:
la source
la source
json.dumps
c'est déterministe avec les paramètres par défaut).