如何在嵌套字典中获取特定键中值的级别

2024-04-19 15:43:25 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下词典:

a={'brother': {'name': 'paskal', 'surname': 'leonis'},
   'family':  {'parents': {'father': 'telis',
                           'mother': 'xrisanthi',
                           'name': 'dimitris'}},
   'name': 'alekos'}

所需的输出是得到一个列表:

[['paskal',1],['dimitris',2],['alekos',0]]

所以我想得到所有具有name的键的值,以及它们的键被找到的级别(从零开始)

到目前为止,我已经成功地得到了值,但我发现的水平是不正确的。我正在使用以下代码:

from six import iteritems
def findKey_printValue(key, document,c=0):
    if isinstance(document, dict):
        for k, v in iteritems(document):
            if k == key:
                yield [v,c]
            elif isinstance(v, dict):
                c+=1
                for result in findKey_printValue(key, v,c):
                    yield result


In [125]:list(findKey_printValue('name',a))
Out[125]:[['dimitris', 2], ['paskal', 2], ['alekos', 2]]

有什么帮助吗?你知道吗


Tags: keynameinforifdocumentdictisinstance
3条回答

不要在当前函数本身中更新c的值,只需在递归调用中更新:

    elif isinstance(v, dict):
        for result in findKey_printValue(key, v, c+1):
            yield result

您需要确保c变量只会随着级别的降低而增加。当您向上运行堆栈时,c不应该改变。你知道吗

修改此项:

   c+=1
   for result in findKey_printValue(key, v,c):
       yield result

对此:

   for result in findKey_printValue(key, v,c+1):
       yield result

不要传递c,而是传递值的增量(否则所有结果都引用了c):

from six import iteritems
def findKey_printValue(key, document,c=0):
    if isinstance(document, dict):
        for k, v in iteritems(document):
            if k == key:
                yield (v,c)
            elif isinstance(v, dict):
                for result in findKey_printValue(key, v, c + 1):
                    yield result

相关问题 更多 >