Попытка найти, существует ли значение в вложенном словаре

Вопрос или проблема

У меня есть следующий вложенный словарь, но я не могу понять, как получить конкретное вложенное значение:

dictionary = {
    "UID1" : {
        "es" : {
            "lemma" : "caminar",
            "conjugations" : {
                "present_simple" : {
                    "1ps" : "camino",
                    "2ps" : "caminas",
                    "3ps" : "camina",
                    "1pp" : "caminamos",
                    "2pp" : "camináis",
                    "3pp" : "caminan"
                }
            }
        }
    },
    "UID2" : {
        "es" : {
            "lemma" : "cocinar",
            "conjugations" : {
                "present_simple" : {
                    "1ps" : "cocino",
                    "2ps" : "cocinas",
                    "3ps" : "cocina",
                    "1pp" : "cocinamos",
                    "2pp" : "cocináis",
                    "3pp" : "cocinan"
                }
            }
        }
    }
    }

def word_check(word):
    if any (word) in dictionary.values():
        print("Yes")
    else:
        print("No")

word_check("camino")

Но это не работает.

Я рассматривал цикл for, но не мог понять, как сделать так, чтобы он обходил вложенные ключи нейтральным способом. Также проверил рекурсивные циклы, но тоже не могу понять, как их использовать. Мне кажется, что я почти там, но не могу все это собрать воедино…

Что-то вроде:

dictionary.values() = primary_key
primary_key.values() = layer_one
layer_one.values() = layer_two
и т.д.

Но это не кажется очень “питоничным”…

  • Вы можете использовать простую рекурсивную функцию для проверки значения в вложенном словаре
  • пример кода:
def value_exists(nested_dict, target_value):
    for key, value in nested_dict.items():
        if isinstance(value, dict):
            if value_exists(value, target_value):
                return True
        elif value == target_value:
            return True
    return False
  • тестовый код:
dictionary = {
    "UID1": {
        "es": {
            "lemma": "caminar",
            "conjugations": {
                "present_simple": {
                    "1ps": "camino",
                    "2ps": "caminas",
                    "3ps": "camina",
                    "1pp": "caminamos",
                    "2pp": "camináis",
                    "3pp": "caminan"
                }
            }
        }
    },
    "UID2": {
        "es": {
            "lemma": "cocinar",
            "conjugations": {
                "present_simple": {
                    "1ps": "cocino",
                    "2ps": "cocinas",
                    "3ps": "cocina",
                    "1pp": "cocinamos",
                    "2pp": "cocináis",
                    "3pp": "cocinan"
                }
            }
        }
    }
}

print(value_exists(dictionary, "camino"))  # True
print(value_exists(dictionary, "correr"))  # False

Ответ или решение

Для проверки наличия определённого значения в вложенном словаре в Python важно использовать правильную логику обхода структуры данных. Данная задача может быть решена с помощью рекурсивной функции. Рекурсия позволяет эффективно проверять все уровни вложенности словаря, независимо от его структуры.

Решение проблемы: Проверка существования значения в вложенном словаре

Ваша структура данных — это словарь, состоящий из нескольких уровней вложенности. Мы можем реализовать функцию, которая будет проверять наличие целевого значения на всех уровнях словаря. Давайте рассмотрим пример кода, который решает вашу задачу:

def value_exists(nested_dict, target_value):
    # Перебираем все ключи и значения в словаре
    for key, value in nested_dict.items():
        # Если текущее значение является словарём, рекурсивно вызываем функцию
        if isinstance(value, dict):
            if value_exists(value, target_value):
                return True
        # Если текущее значение равно искомому значению, возвращаем True
        elif value == target_value:
            return True
    # Если значение не найдено, возвращаем False
    return False

Использование функции

Теперь давайте протестируем нашу функцию на примере вашего вложенного словаря:

dictionary = {
    "UID1": {
        "es": {
            "lemma": "caminar",
            "conjugations": {
                "present_simple": {
                    "1ps": "camino",
                    "2ps": "caminas",
                    "3ps": "camina",
                    "1pp": "caminamos",
                    "2pp": "camináis",
                    "3pp": "caminan"
                }
            }
        }
    },
    "UID2": {
        "es": {
            "lemma": "cocinar",
            "conjugations": {
                "present_simple": {
                    "1ps": "cocino",
                    "2ps": "cocinas",
                    "3ps": "cocina",
                    "1pp": "cocinamos",
                    "2pp": "cocináis",
                    "3pp": "cocinan"
                }
            }
        }
    }
}

# Примеры использования функции
print(value_exists(dictionary, "camino"))  # True
print(value_exists(dictionary, "correr"))   # False

Объяснение кода

  1. Цикл по элементам словаря: Для каждого ключа и значения в словаре мы проверяем, является ли текущее значение словарём.

  2. Рекурсивная проверка: Если значение — это словарь, мы вызываем ту же функцию value_exists, передавая вложенный словарь для дальнейшей проверки.

  3. Сравнение значений: Если текущее значение не является словарём, мы проверяем, равно ли оно искомому значению (target_value). Если да, функция возвращает True.

  4. Завершение функции: Если функция перебрала все элементы и не нашла искомое значение, она возвращает False.

Заключение

Использование рекурсии — это элегантный способ обработки вложенных структур данных в Python. Несмотря на то, что решение задач, связанных с вложенными словарями, может показаться сложным, правильная реализация функции, как показано выше, помогает эффективно справляться с этой проблемой. Теперь вы можете легко проверять наличие значений в любых словарях независимо от их вложенности.

Оцените материал
Добавить комментарий

Капча загружается...