找到嵌套字典的子键

时间:2014-11-17 08:07:54

标签: python dictionary

我有一个嵌套字典,与描述in this link非常相似。

用户arainchi在那里发布了以下功能:

def findkeys(node, kv):
    if isinstance(node, list):
        for i in node:
            for x in findkeys(i, kv):
               yield x
    elif isinstance(node, dict):
        if kv in node:
            yield node[kv]
        for j in node.values():
            for x in findkeys(j, kv):
                yield x

如果我这样做

print (list(findkeys(d, 'id')))

打印给定键的子项作为生成器对象类型。

当我尝试时,按

列出键()
print ((findkeys(d, 'id')).keys())

我正在

AttributeError: 'generator' object has no attribute 'keys'

如何获取被检索儿童的钥匙?

示例:

cfg_dict = { 'mobile' :
                { 'checkBox_OS' :
                  { 'status' : 'None', 
                    'radioButton_Andriod' :
                      { 'status' : 'None',
                        'comboBox_Andriod_Brands' : 'LG'},
                    'radioButton_Windows' :
                      { 'status' : 'None',
                        'comboBox_Windows_Brands' : 'Nokia'},
                    'radioButton_Others' :
                      { 'status' : 'None',
                        'comboBox_Others_Brands' : 'Apple'}},
                  'checkBox_Screen_size' :
                    { 'status' : 'None',
                      'doubleSpinBox_Screen_size' : '5.0' }}
              }

print ("findkeys: ", findkeys(self.cfg_dict, "radioButton_Andriod"))
print ("list of findkeys:", list(findkeys(self.cfg_dict, "radioButton_Andriod")))
print ("keys of findKeys:", list(findkeys(self.cfg_dict, "radioButton_Andriod"))[0].keys())

输出:

findkeys:  <generator object findkeys at 0x02F0C850>
list of findkeys: [{'status': False, 'comboBox_Andriod_Brands': 'Sony'}]
keys of findKeys: dict_keys(['status', 'comboBox_Andriod_Brands'])

我想迭代孩子的钥匙。 像,

#pseudo code        
for everykey in child.keys()
  if everykey.value == "this":
    #do this
  else:
    #do that

2 个答案:

答案 0 :(得分:2)

list(findkeys(d, 'id'))[0].keys()

找到第一个孩子的钥匙。如果它不是一个字典,它将会出错,所以你可能需要检查

编辑:根据您在新编辑中提出的要求

for value in findkeys(d, 'id'):
    for child_key, child_value in value.items():
        if child_value == 'this':
            # do this
        else:
            # do that

答案 1 :(得分:0)

我为此做了一个pypi包。您可以在这里参考https://test.pypi.org/project/dictnodefinder/1.0.1.dev1/

先安装

pip install dictnodefinder

然后像这样使用它

import dictnodefinder

source = {‘a’:{‘b’:0}}    
key_to_find = ‘b’

print(dictnodefinder.findkeys(source, key_to_find))