如何获取嵌套Dictionary中特定键的值级别

时间:2016-02-04 16:45:14

标签: python recursion

假设我有以下词典:

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

任何帮助?

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

不要传递int x; extern int end, edata; void *stack_bottom; bool IS_IN_STACK(void *x) __attribute__((noinline)); bool IS_IN_STACK(void *x) { void *stack_top = &stack_top; return x <= stack_bottom && x >= stack_top; } #define IS_STATIC(x) ((void*)(x) <= (void*)&end || (void*)(x) <= (void*)&edata) int foo (void) { int s; int *h = malloc (sizeof(int)); printf ("x = %p, *s = %p, h = %p\n", &x, &s, h); // prints 0 1 0 printf ("%d %d %d\n", IS_IN_STACK(&x), IS_IN_STACK(&s), IS_IN_STACK(h)); // prints 1 0 0 printf ("%d %d %d\n", IS_STATIC(&x), IS_STATIC(&s), IS_STATIC(h)); } int main (int argc, char *argv[]) { int x; stack_bottom = &x; foo(); return 0; } ,而是增加值(否则所有结果都会引用c):

c

答案 2 :(得分:1)

您需要确保scope变量仅在您下降某个级别时增加。当您运行堆栈时,validates_uniqueness_of不应该更改。

修改:

c

到此:

c

答案 3 :(得分:1)



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

holder = {}

def get(d, count):
    if isinstance(d, dict):
        for key, val in d.items():
            if isinstance(val, dict):
                get(val, count+1)
            elif key=='name':
                holder[val]=count

get(a, 0)