【问题标题】:How to navigate a dict by list of keys?如何通过键列表导航字典?
【发布时间】:2019-04-11 05:59:56
【问题描述】:

从这样的嵌套字典开始:

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']

假设存在键的“路径”,但不要假设结构中的任何深度。

【问题讨论】:

  • 避免在 cmets 中回答问题。

标签: python python-3.x dictionary key traversal


【解决方案1】:

你可以把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']}

【讨论】:

    【解决方案2】:

    使用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", "USA", "Virginia"]
    
    result = reduce(lambda x, y : x.get(y), [my_dict] + keys)
    print(result)
    

    输出

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 2015-04-12
      • 2013-04-29
      • 2020-08-06
      • 2013-05-22
      • 2019-03-09
      • 1970-01-01
      相关资源
      最近更新 更多