Как ориентироваться по списку клавиш? - PullRequest
0 голосов
/ 07 ноября 2018

Начиная с вложенного словаря, например:

my_dict = {"North America" : { "USA" : { "Virginia" : ["Norfolk","Richmond","Charlottesville"], "New York": ["Albany"]}, "Canada" : {"Saskatchewan": ["Saskatoon"], "New Brunswick":["Moncton","Saint John"]}}}

print(my_dict)
North America
    USA
        Virginia
            ['Norfolk', 'Richmond', 'Charlottesville']
        New York
            ['Albany']
    Canada
        Saskatchewan
            ['Saskatoon']
        New Brunswick
            ['Moncton', 'Saint John']

Как мне взять список строк типа [key1, key2] и программно вернуть вложенный объект my_dict[key1][key2], когда я не знаю, сколько ключей будет? Примеры:

keys = ['North America', 'USA']
print(my_dict.???)
    Virginia
        ['Norfolk', 'Richmond', 'Charlottesville']
    New York
        ['Albany']

keys = ['North America', 'Canada', 'Saskatchewan']
print(my_dict.???)
    ['Saskatoon']

keys = ['North America', 'Canada']
print(my_dict.???)
    Saskatchewan
        ['Saskatoon']
    New Brunswick
        ['Moncton', 'Saint John']

Предположим, что "путь" к ключам существует, но не предполагайте ничего о глубине структуры.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вы можете бросить functools.reduce на него.

>>> from functools import reduce
>>>
>>> my_dict = {"North America" : { "USA" : { "Virginia" : ["Norfolk","Richmond","Charlottesville"], "New York": ["Albany"]}, "Canada" : {"Saskatchewan": ["Saskatoon"], "New Brunswick":["Moncton","Saint John"]}}}
>>> keys = ['North America', 'Canada']
>>> reduce(dict.get, keys, my_dict)
>>> {'New Brunswick': ['Moncton', 'Saint John'], 'Saskatchewan': ['Saskatoon']}

... или напишите свою собственную функцию.

def nest_get(dic, keys):
    result = dic
    for k in keys:
        result = result[k]
    return result

Демо-версия:

>>> nest_get(my_dict, keys)
>>> {'New Brunswick': ['Moncton', 'Saint John'], 'Saskatchewan': ['Saskatoon']}
0 голосов
/ 07 ноября 2018

Использование уменьшение :

from functools import reduce

my_dict = {"North America": {"USA": {"Virginia": ["Norfolk", "Richmond", "Charlottesville"], "New York": ["Albany"]},
                             "Canada": {"Saskatchewan": ["Saskatoon"], "New Brunswick": ["Moncton", "Saint John"]}}}

keys = ["North America", "USA", "Virginia"]

result = reduce(lambda x, y : x.get(y), [my_dict] + keys)
print(result)

выход

['Norfolk', 'Richmond', 'Charlottesville']
...