gpt4 book ai didi

python - 如何查找嵌套字典中某个键的所有出现,同时还跟踪外部字典键值?

转载 作者:行者123 更新时间:2023-12-01 09:13:55 24 4
gpt4 key购买 nike

我在 stackoverflow 上进行了搜索,发现以下代码允许我递归地搜索嵌套字典中的键值。但是,我还想跟踪外部字典的键值。我该怎么做?

从下面链接中阿尔夫的回答,我可以使用下面的代码获取嵌套字典中键的所有值。 Find all occurrences of a key in nested python dictionaries and lists

data = {'item1': {
'name': 'dummy',
'type': 'dummy1'},

'item2': {
'name': 'dummy',
'type': 'dummy1',
'label':'label2'
},

'item3': {
'name': 'dummy',
'type': 'dummy1',
'label':'label3'},

'item4': {
'name': 'dummy',
'type': 'dummy1'}
}

def find(key, dictionary):
for k, v in dictionary.items():
if k == key:
yield v
elif isinstance(v, dict):
for result in find(key, v):
yield result
elif isinstance(v, list):
for d in v:
for result in find(key, d):
yield result


In[1]:list(find('label', data))
Out[1]:
['label2', 'label3']

但是,我还需要记录外部字典键,如下所示。我该怎么做?而且我的数据可能有不止一层。

{'item2':'label2',
'item3':'label3'
}

我还发现此链接中的 recursive_lookup 写得非常工整。但是,当我尝试运行它时,它返回 None

Find keys in nested dictionary

def recursive_lookup(k, d):
if k in d:
return d[k]
for v in d.values():
if isinstance(v, dict):
return recursive_lookup(k, v)
return None

当我调用 recursive_lookup('label', data) 时,它返回 None

如果有人能为我指出为什么上面的代码不起作用,那就太好了!

最佳答案

无论嵌套有多深(至少达到堆栈限制),这都应该有效。跟踪字典 key 的请求有点尴尬——我使用一个元组来返回该对。请注意,如果找到的值位于最外层字典中,则它不会是元组格式。

def recursive_lookup(key, d):
if key in d:
return d[key]

for k, v in d.items():
if isinstance(v, dict):
result = recursive_lookup(key, v)

if result:
return k, result


print(recursive_lookup('label', data))

输出:

('item2', 'label2')

这是一个有点困惑的版本(我并不热衷于内部函数,但至少累加器列表不是参数,也不是全局的),但会返回嵌套到的所有找到的项目的列表堆栈限制,最外面的键除外:

def recursive_lookup(key, d):
def _lookup(key, d):
if key in d:
return d[key]

for k, v in d.items():
if isinstance(v, dict):
result = _lookup(key, v)

if result:
accumulator.append((k, result))

accumulator = []
_lookup(key, d)
return accumulator

输出:

[('item3', 'label3'), ('item2', 'label2')]

如果你想输出一个字典,这可以很容易地修改 - 将 accumulator = [] 替换为 accumulator = {}accumulator.append(( k, result))accumulator[k] = result,但这可能很难使用,而且您无法存储重复的键条目。

至于你的最后一个问题,你得到 None 的原因是因为内部循环在检查第一个项目是否找到某些内容后返回。由于 label 位于 items() 数组的第二个位置,因此它永远不会被查看。

关于python - 如何查找嵌套字典中某个键的所有出现,同时还跟踪外部字典键值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51413998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com