从嵌套字典中获取父键
Posted
技术标签:
【中文标题】从嵌套字典中获取父键【英文标题】:Get parents keys from nested dictionary 【发布时间】:2013-02-19 01:09:23 【问题描述】:从下面的嵌套字典中,如何获取'value4ac'
的每个父字典键?通过启动'value4ac'
值,我想得到'key4'
、'key4a'
、'Key4ac'
。
example_dict = 'key1' : 'value1',
'key2' : 'value2',
'key3' : 'key3a': 'value3a' ,
'key4' : 'key4a':
'key4aa': 'value4aa',
'key4ab': 'value4ab',
'key4ac': 'value4ac'
,
'key4b': 'value4b'
【问题讨论】:
键名背后有逻辑吗?我的意思是,你知道'key4ac'
会在dict
中被key4
“引用”吗?
【参考方案1】:
递归救援!
example_dict = 'key1' : 'value1',
'key2' : 'value2',
'key3' : 'key3a': 'value3a' ,
'key4' : 'key4a': 'key4aa': 'value4aa',
'key4ab': 'value4ab',
'key4ac': 'value4ac',
'key4b': 'value4b'
def find_key(d, value):
for k,v in d.items():
if isinstance(v, dict):
p = find_key(v, value)
if p:
return [k] + p
elif v == value:
return [k]
print find_key(example_dict,'value4ac')
工作原理
查看物品并检查 2 个案例
item 不是字典——在这种情况下,看看它是否是我们正在寻找的值。如果是,则返回一个仅包含键的列表。 (这是我们递归的基本情况)。 item 是一个字典 -- 尝试在该字典中查找键。如果在该字典(或任何子字典)中找到它,则返回将正确路径预先附加到路径其余部分的键。【讨论】:
def find_key(d,key):
你的意思是def find_key(d,value):
,对吗?
@zelusp -- 是的,那个变量的名字是......不幸。 :-)。感谢您的建议。
如何查找多次出现?例如带有关键路径的列表列表。例如:[['key4', 'key4a', 'key4ac'], ['key5, 'key5a', 'key5ac']]
【参考方案2】:
如果您的字典也包含列表怎么办?
这是@mgilson 解决方案的一个更广泛的变体,适用于 JSON:
example_dict_with_list = 'key1' : 'value1',
'key2' : 'value2',
'key3' : 'key3a': 'value3a' ,
'key4' : 'key4a': [ 'key4aa': 'value4aa',
'key4ab': 'value4ab',
'key4ac': 'value4ac'],
'key4b': 'value4b'
def breadcrumb(json_dict_or_list, value):
if json_dict_or_list == value:
return [json_dict_or_list]
elif isinstance(json_dict_or_list, dict):
for k, v in json_dict_or_list.items():
p = breadcrumb(v, value)
if p:
return [k] + p
elif isinstance(json_dict_or_list, list):
lst = json_dict_or_list
for i in range(len(lst)):
p = breadcrumb(lst[i], value)
if p:
return [str(i)] + p
print(
breadcrumb(example_dict_with_list, 'value4aa')
)
返回
['key4', 'key4a', '0', 'key4aa', 'value4aa']
奖金
如果你需要很好地打印出来,就像一串面包屑,那么做
print(
' > '.join(
breadcrumb(example_dict, 'value4aa')
)
)
哪个会返回
'key4 > key4a > 0 > key4aa > value4aa'
【讨论】:
以上是关于从嵌套字典中获取父键的主要内容,如果未能解决你的问题,请参考以下文章