Python навигация по вложенному словарю

#python-3.x #dictionary

#python-3.x #словарь

Вопрос:

У меня есть вложенный словарь, который может иметь неуникальные ключи

Мне нужно динамически добавлять / получать пары ключ-значение в этом словаре по их ключу в строковом формате

Строка, являющаяся именем ключа, считывается из ввода с клавиатуры в строковом формате

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

Ключи могут быть неуникальными на разных уровнях вложенности

Но они уникальны на одном уровне вложенности

Например, у меня есть этот dict:

 MyDict = {'a': 1, 'b': 2}
 

Теперь я получаю некоторый ввод в строковом формате, который подсказывает мне добавить еще один уровень вложенности с ключом ‘c’, а затем заполнить его парой ключ-значение ‘a: 3’. Я делаю это так:

 last_edited_element = {'a': 3}
MyDict['c'] = last_edited_element
    
#MyDict is now {'a': 1, 'b': 2, 'c': {'a': 3}}
 

Затем я получаю ввод, который подсказывает мне что-то сделать с парой ключ-значение, которая имеет ключ «a»

Мне дано правило, согласно которому сначала я должен искать ключ «a» на уровне, который был отредактирован последним, затем, если ничего не найдено, перейдите на один уровень выше. Я сохраняю свой последний отредактированный элемент в переменной last_edited_element.

Последним отредактированным элементом был {‘a’: 3}, поэтому я делаю:

 if 'a' in last_edited_element:
     #do something with {'a': 3}
else:
     #go one level up and look for 'a' key there
 

Итак, вопрос в том, как мне перейти на один уровень выше? У меня есть {a: ‘3’}, сохраненный в переменной last_edited_element, мне нужно получить доступ к словарю верхнего уровня, если таковой имеется, который содержит last_edited_element, что-то вроде last_edited_element.get_parent_dictionary()
Как мне это сделать?

Комментарии:

1. Вы можете связать каждый вложенный уровень с его ключом в родительском словаре

2. Требуется ли выполнять поиск снизу вверх? Идеально перейти сверху вниз, а затем выбрать нужный ключ

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

Ответ №1:

Итак, следуя моему первому комментарию, вы могли бы сделать это:

  1. Инициализировать dict верхнего уровня
  2. Инициализируйте все дочерние элементы для ссылки на их родительский
  3. Рекурсивный поиск снизу вверх, пока не найдете ключ или None
 example_dict = {'a': 1, 'b': 2, 'parent': None}
example_dict['c'] = {'a': 3, 'parent': example_dict}

def find_key(k, d):
    if k in d:
        return d[k]
    elif d['parent'] is None:
        return None
    return find_key(k, d['parent'])
 
 print(find_key('a', example_dict['c']))
> 3

print(find_key('b', example_dict['c']))
> 2
 

Комментарии:

1. example_dict = {‘a’: 1, ‘b’: 2, ‘parent’: None} example_dict[‘c’] = {‘a’: 3, ‘parent’: example_dict} это приведет к рекурсии и создаст следующий словарь: {‘a’: 1,’b’: 2, ‘parent’: None, ‘c’: {‘a’: 3, ‘parent’: {…}}}

2. Что вы имеете в виду @prupru?

3. @prupru предлагаемое решение выполняет поиск снизу вверх от указанного узла, но структура данных должна быть инициализирована, чтобы всегда предоставлять указатель на родительский элемент, поскольку невозможно получить родительский элемент словаря, если вы явно не закодируете это.

4. эти две строки example_dict = {‘a’: 1, ‘b’: 2, ‘parent’: None} example_dict[‘c’] = {‘a’: 3, ‘parent’: example_dict}, они создают словарь {‘a’: 1, ‘b’: 2, ‘parent’: None, ‘c’: {‘a’: 3, ‘parent’: {…}}} что означают эти точки ‘…’? больше вложенных словарей?

5. Да, они это делают. Хотя я не вижу проблемы.