1
votes

Comment puis-je vérifier si une valeur existe dans un dictionnaire, qui se trouve dans une liste dans un autre dictionnaire?

J'ai un dictionnaire qui contient plusieurs clés et valeurs, dont l'une contient une liste de plusieurs dictionnaires. Je dois être en mesure de trouver si une valeur donnée existe dans ces dictionnaires, mais je ne sais pas comment les vérifier quand elles existent non seulement dans une liste, mais dans une propriété d'objet.

Alors qu'une vérification de la boucle for pourrait accomplir cela, la propriété pourrait finir par contenir des centaines de valeurs, ce qui rendrait cette approche inefficace.

J'ai également essayé des variantes de: if in [[

Mais, je continue à obtenir des TypeErrors que les index de liste doivent être un entier ou une tranche (Les valeurs sont des chaînes).

Un exemple de code serait:

dictExample = {
"name": "yes",
"age": 25,
"Check_Me": [
    {"type": "code", "value": "001"},
    {"type": "code", "value": "002"},
    {"type": "code", "value": "003"},
    {"type": "code", "value": "004"},
    {"type": "code", "value": "005"}
    ],
}

if "007" not in dictExample["Check_Me"]["value"]:
    print("It works!")
else:
    print("Failure...")

(je ne peux pas télécharger le code réel, mais c'est à peu près ce à quoi je suis confronté .)

La sortie attendue serait que le code s'exécute sans erreur et qu'il soit capable de trouver avec succès si la valeur est dans le dictionnaire imbriqué ou non.


0 commentaires

3 Réponses :


0
votes
dictExample = {
"name": "yes",
"age": 25,
"Check_Me": [
    {"type": "code", "value": "001"},
    {"type": "code", "value": "002"},
    {"type": "code", "value": "003"},
    {"type": "code", "value": "004"},
    {"type": "code", "value": "005"}
    ],
}
if "007" not in [d['value'] for d in dictExample['Check_Me']]:
    print("It works!")
else:
    print("Failure...")

Just iterate over Check_Me and get all the values of key 'value' from dictionary.

0 commentaires

2
votes

Un exemple consiste à utiliser la fonction intégrée qui court circuits lorsque la première correspondance est trouvée. Cependant, il existe plusieurs options

if not any("007" in x["value"] for x in dictExample["Check_Me"]):
    print("It works!")


0 commentaires

0
votes

Vous pouvez avoir besoin d'une récursivité:

def val_in_dict(my_val, the_dict):
    for value in the_dict.values():
        if my_val == value:
            return True
        elif isinstance(value, list):
            for element in value:
                if isinstance(element, dict) and val_in_dict(my_val, element):
                    return True
    return False
if val_in_dict("007", d):
    print("It works")

Vous pouvez également changer une ligne là-haut en isinstance (value, (list, tuple)) ou quelque chose de plus compliqué. L'utilisation de la récursivité vous permet d'être plus flexible sur la profondeur de votre hiérarchie de données.


0 commentaires