如何通过键列表导航字典?
How to navigate a dict by list of keys?
从这样的嵌套字典开始:
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]
之类的字符串列表并以编程方式 return 嵌套对象 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']
假设键的 "path" 存在,但不要假设结构中的任何深度。
使用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']
你可以把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']}
从这样的嵌套字典开始:
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]
之类的字符串列表并以编程方式 return 嵌套对象 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']
假设键的 "path" 存在,但不要假设结构中的任何深度。
使用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']
你可以把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']}