假设我有以下词典:
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]]
任何帮助?
答案 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)