Как я могу проверить, существует ли значение в словаре, который находится в списке в другом словаре? - PullRequest
0 голосов
/ 30 января 2019

У меня есть словарь, который содержит несколько ключей и значений, одно из которых содержит список других словарей.Мне нужно иметь возможность найти, существует ли заданное значение в этих словарях, но я не уверен, как проверить их, если они существуют не только в списке, но и в свойстве объекта.

Хотя дляПроверка цикла может выполнить это, свойство может в конечном итоге содержать сотни значений, что сделает этот подход неэффективным.

Я также пробовал варианты: if <value> in <dict>[<list>][<dict2>]

Но я продолжаю получать TypeErrors, что индексы списка должны быть целым числом или срезом (значения являются строками).

Примером кода может быть:

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...")

(я не могу загрузить фактический код, но это примерно то, с чем я сталкиваюсь.)

Ожидаемый вывод будет, что код выполняетсябез ошибок и может успешно определить, находится ли значение во вложенном словаре или нет.

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Одним из примеров является использование встроенной функции any , которая замыкает накоротко, когда найдено первое совпадение.Однако есть несколько вариантов

if not any("007" in x["value"] for x in dictExample["Check_Me"]):
    print("It works!")
0 голосов
/ 30 января 2019

Вам может понадобиться рекурсия:

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")

Вы также можете изменить строку там на isinstance(value, (list, tuple)) или что-то более сложное.Использование рекурсии позволяет вам более гибко оценивать глубину иерархии данных.

0 голосов
/ 30 января 2019
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...")
  • Просто переберите Check_Me и получите все значения ключа 'value' из словаря.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...