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

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

x['key1']['key2']['key3'] = value

Это работает, если я заранее знаю иерархию.Это не вариант.Я ищу схему адресации, такую ​​как 'key1 / key2 / key3', которая могла бы быть указана во время выполнения для доступа к желаемой паре ключ-значение.Есть предложения?

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

В самом начале подхода вы можете разобрать строку типа 'key1/key2/key3' в функцию, которая будет выполнять то, что вы хотите.Например:

# Assuming for this example that s is just a `/`-delimted string of keys.
def make_getter(s):
    keys = s.split("/")
    def _(d):
        rv = d
        for k in keys:
            try:
                rv = rv.get(k)
            except AttributeError:
                rv = None
                break
        return rv
    return d

Тогда

>>> accessor = make_getter("foo/bar/baz")
>>> accessor({'foo': {'bar': {'baz': 3}}})
3
>>> accessor({'foo': 9})
None 
0 голосов
/ 08 июня 2019

Вы можете использовать рекурсивный подход для поиска во вложенном словарном представлении, пока не найдете 'key1', а затем вернете поиск [key1] [key2] [key3]. Это предполагает, что ключ1 не дублируется в структуре данных.

In [9]: def lookup(key, nested_dict):
   ...:     for k, v in nested_dict.items():
   ...:         if k == key:
   ...:             return v
   ...:         if isinstance(v, dict):
   ...:             val = lookup(key, v)
   ...:             if val:
   ...:                 return val
   ...:     return None

In [10]: a = {'b' :{'c':{'d':1}}, 'f':2}
In [11]: lookup('d', a)
Out[11]: 1

In [12]: lookup('b', a)
Out[12]: {'c': {'d': 1}}

In [13]: lookup('c', a)
Out[13]: {'d': 1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...