J'ai juste une question si dans l'un de mes dictionnaires j'ai plus de valeur que l'autre, puis-je quand même comparer les deux dictionnaires ou dois-je changer mon code? Par exemple comme ceci:
Mon code:
result={"jazi": 1, "juge": 1, "juha": 9, "lebe": 4}
result2={"jazi": 3, "juge": 4, "juha": 1, "lebe": 4, "aba":7, "meze":9}
sortie:
for key in result:
if result[key]!=result2[key]:
print("%s not equal"% (key))
5 Réponses :
Il s'agit d'une approche utilisant dict.get
jazi not equal juge not equal juha not equal
Sortie:
result={"jazi": 1, "juge": 1, "juha": 9, "lebe": 4}
result2={"jazi": 3, "juge": 4, "juha": 1, "lebe": 4, "aba":7, "meze":9}
for key, value in result.items():
if value != result2.get(key, 0): #You can add additional condition to check if key present in `result2`
print("%s not equal"% (key))
Oui, vous pouvez mais n'utilisez pas dict ['key'] et utilisez dict.get ('key') . Voici le code qui ne vous donnera pas d'erreur pour un nombre quelconque de clés.
for key in result:
if result.get(key, "")!= result2.get(key, ""):
print("%s not equal"% (key))
Vos deux dictionnaires peuvent également avoir des clés différentes. Vous devez donc itérer sur la combinaison de touches présentes dans les deux dictionnaires. Pour cela, vous pouvez utiliser set pour obtenir une liste unique de clés des deux dictionnaires comme:
for key in my_keys:
if dict1.get(key) != dict2.get(key):
print("{} is having different value".format(key))
# which will print:
# a is having different value
# c is having different value
# b is having different value
Maintenant, pour obtenir un élément de dict, utilisez dict .get (key) au lieu de dict [key] . dict [key] déclenche une exception KeyError si la clé n'est pas trouvée dans le dictionnaire. Alors que dict.get (get) renvoie None .
Par conséquent, votre code pour parcourir le dictionnaire devrait être comme:
>>> dict1 = {'a': 1, 'b': 2, 'd': 4}
>>> dict2 = {'a': 3, 'c': 3, 'd': 4}
>>> my_keys = set(dict1.keys() + dict2.keys()) # To get unique keys from both dicts
>>> my_keys
set(['a', 'c', 'b', 'd'])
Remarque: Puisque dict.get renvoie Aucun si la clé n'est pas trouvée, le code ci-dessus ne retournera pas le résultat correct si une clé n'est pas présente dans un dict, et la même clé est présente dans un autre dict avec la valeur Aucun . Dans ce cas, vous devez utiliser dict.get avec la valeur par défaut comme dict.get (key, default_value) (où default_value doit être la valeur / chaîne qui ne sera jamais présente comme valeur dans votre dict)
Utiliser get () comme les autres l'ont suggéré est la solution la plus simple, mais si vous le vouliez, vous pourriez être plus précis que de simplement dire "pas égal":
keys, keys2 = set(result), set(result2)
for key in (keys ^ keys2) | {
key for key in keys & keys2 if result[key] != result2[key] }:
print("%s not equal"% (key))
Donne:
keys, keys2 = set(result), set(result2)
print("Only in result:", ", ".join(keys - keys2))
print("Only in result2:", ", ".join(keys2 - keys))
for key in keys & keys2:
if result[key]!=result2[key]:
print("%s not equal"% (key))
Ou peut-être un peu plus clair:
Only in result: Only in result2: aba, meze juha not equal jazi not equal juge not equal
qui est exactement la même mais pré-calcule le définit afin que vous puissiez utiliser les opérateurs en ligne - pour .difference () et & pour .intersection () .
Ou si vous voulez juste le message "pas égal":
result={"jazi": 1, "juge": 1, "juha": 9, "lebe": 4}
result2={"jazi": 3, "juge": 4, "juha": 1, "lebe": 4, "aba":7, "meze":9}
print("Only in result:", ", ".join(set(result).difference(result2)))
print("Only in result2:", ", ".join(set(result2).difference(result)))
for key in set(result).intersection(result2):
if result[key]!=result2[key]:
print("%s not equal"% (key))
Si vous n'avez pas de dictionnaires imbriqués, l'approche set () pourrait apporter quelque chose (voir la docs pour plus d'informations)
result={"jazi": 1, "juge": 1, "juha": 9, "lebe": 4}
result2={"jazi": 3, "juge": 4, "juha": 1, "lebe": 4, "aba":7, "meze":9}
set_1 = set((k, v) for k, v in result.items())
set_2 = set((k, v) for k, v in result2.items())
print(f"not equals: {sorted(list(set1 ^ set2))}")
# not equals: [('aba', 7), ('jazi', 1), ('jazi', 3), ('juge', 1), ('juge', 4), ('juha', 1), ('juha', 9), ('meze', 9)]
print(f"only in first: {sorted(list(set_1 - set_2))}")
# only in first: [('jazi', 1), ('juge', 1), ('juha', 9)]
print(f"only in second: {sorted(list(set_2 - set_1))}")
# only in second: [('aba', 7), ('jazi', 3), ('juge', 4), ('juha', 1), ('meze', 9)]
Mettre les valeurs dans les ensembles peut être un problème si les valeurs ne sont pas hachables.
Mais s'ils sont ... Dieu, combien de maux de tête vous pouvez économiser en utilisant des ensembles!
Oh en effet, c'est pourquoi j'ai également publié une réponse basée sur un ensemble. Tout dépend de ce que veut exactement le PO.
Dans ce scénario, vous manquerez les touches
abaetmeze, mais si c'était l'inverse avec l'attribution deresultet < code> result2 votre code entraînerait uneKeyErrorcar les clés susmentionnées ne sont pas dans le deuxième dictionnaireEnsuite, la valeur doit être stockée en utilisant une autre structure de données comme dict, list ou tuple. par exemple: {"jazi": [1,3], "juge" :( 2,4)}
Cela ressemble à un problème XY. Quel est exactement votre objectif? À la place, vous pouvez utiliser les opérations d'ensemble pour comparer les clés.