如何从嵌套字典中检索所有“组”

时间:2019-05-07 09:39:30

标签: python-3.x

从给定的字典中查找,如下所示:

int main(){
char a[4];
while(scanf("%s",&a)!=EOF){
    int b,c;
    scanf("%d",&b);
    for(c=1;c<=b;c++){
        char d[100];
        int e,f=0,g=0;

        scanf("%s",&d);
        for(e=0;e<=3;e++)
            if(a[e]==d[e])
                f++;
        for(e=0;e<=3;e++)
            if(a[e]!=d[e]&&a[e]==d[(e+1)%4]||a[e]==d[(e+2)%4]||a[e]==d[(e+3)%4])
                g++;
        printf("%dA%dB\n",f,g);
    }
}
    return 0;}

我想按以下方式检索嵌套组的所有键:

QListView::item { 
    border:none 
}

输出可能在新的词典中,输出的顺序并不重要,所有叶子元素都应忽略。嵌套级别的数量应该是任意的,因为嵌套可能会“无限地”进行。

这是我当前的代码:

{
    'parent1': {
        'child1-1': {
            'element1': 'val1',
            'element2': 'val2'
        },
        'child1-2': {
            'element1': 'val1',
            'element2': 'val2'
        }
    },
    'parent2': {
        'child2-1': {
            'subchild2-1-1': {
              'subelement1': 'val1'  
            },
            'element2': 'val2'
        },
        'child2-2': {
            'element1': 'val1',
            'element2': 'val2'
        }
    }
}

哪个返回以下内容:

'parent1':       ['child1-1', 'child1-2']
'child1-1':      ['element1', 'element2']
'child1-2':      ['element1', 'element2']
'parent2':       ['child2-1', 'child2-2']
'child2-1':      ['subchild2-1-1', 'element2']
'subchild2-1-1': ['subelement1']
'child2-2':      ['element1', 'element2']

这显然是不完整的,因为缺少子组。我觉得我太复杂了...

1 个答案:

答案 0 :(得分:1)

这就是您想要的:

def retrieve_groups(d, ret={}):
    ret.update({key: [subkey for subkey in value] 
                for key, value in d.items() if isinstance(value, dict)})
    for value in d.values():
        if not isinstance(value, dict):
            continue
        retrieve_groups(d=value, ret=ret)

    return ret

我在其中使用ret作为可变参数,该参数在递归过程中更新。其余的应该简单明了。

输出为:

{   'child1-1': ['element1', 'element2'],
    'child1-2': ['element1', 'element2'],
    'child2-1': ['subchild2-1-1', 'element2'],
    'child2-2': ['element1', 'element2'],
    'parent1': ['child1-1', 'child1-2'],
    'parent2': ['child2-1', 'child2-2'],
    'subchild2-1-1': ['subelement1']}