Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取python中嵌套字典的值_Python_Dictionary - Fatal编程技术网

获取python中嵌套字典的值

获取python中嵌套字典的值,python,dictionary,Python,Dictionary,我有一个嵌套字典,如下所示 myTodo= { 'taskid': '10', 'taskstatus': 'in progress', 'Kitchen': { 'Stove':{ 'LED1':

我有一个嵌套字典,如下所示

myTodo= {          
                'taskid': '10',
                'taskstatus': 'in progress',

                'Kitchen': 
                {                    
                    'Stove':{
                                'LED1':
                                {
                                'taskid': '11',
                                'taskstatus':'running'
                                },

                                'LED2':
                                {
                                    'taskid': '12',
                                    'taskstatus':'off',
                                    'LEDSub':
                                    { 
                                       'taskid': '13',
                                       'taskstatus':'stable',
                                       'LEDSub2':
                                        {
                                           'taskid': '14',
                                           'taskstatus':'burnt'
                                        }
                                    }
                                },

                                'LED3':
                                {
                                'taskid': '15',
                                'taskstatus':'new'
                                } 
                           },
                  //other nested layers
               }
我有一个python方法,它根据键返回到达“值”的路径。 方法如下所示

 def route(myTodo, id):
        q = list()
        q.append((list(), myTodo))
        while q:
            this_key_chain, this_v = reverse_linked_q.pop()
            # finish search if found the id 
            if this_v == id:
                return this_key_chain
            # not found. keep searching        
            try:
                items = this_v.items()
            except AttributeError:
                continue
            for k, v in items:
                q.append((this_key_chain + [k], v))
        raise KeyError
此方法根据键返回路由。因此,如果我
route(myTodo,“11”)
,它将返回列表,keyroute=[“厨房”、“炉子”、“LED1”、“任务ID”]

然后我从keyroute列表中删除“taskid”,并将该列表发送到以下方法

    def createOutputDic(keyroute, myTodo):
        for k in keyroute:
            myTodo = myTodo.get(k)
        return j
对于
route(myTodo,“11”)
,来自
createOutputDic(keyroute,myTodo)
的输出为

{ 
 'taskid': '11',
 'taskstatus':'running'
}
当我以
route(myTodo,“12”)
的身份拨打电话时,问题就出现了。我希望得到

{ 'taskid': '12',
  'taskstatus':'off'
}
但结果是

{ 
  'taskid': '12',
  'taskstatus':'off',
  'LEDSub':
   { 
     'taskid': '13',
     'taskstatus':'stable',
   'LEDSub2':
   {
     'taskid': '14',
     'taskstatus':'burnt'
   }
}
我只想

{ 'taskid': '12',
  'taskstatus':'off'
}
但是我不明白为什么当前的route(…)方法不能做到这一点。 字典可以嵌套得很深,我想要一个通用方法。
有人能帮助我或指导我找到更好的方法来解决这个问题吗?非常感谢您的帮助。

您可以将递归用于:

输出:

{'taskid': '12', 'taskstatus': 'off'}

要格式化输出,将使用所需输出中包含的相同键创建字典。
yield
语句创建一个生成器对象,该对象指向内存中的其他对象,动态地“生成”。基于生成器的解决方案比使用
return
要干净一些,因为后者需要在第二个
for
循环之外创建一个列表,每个
get\u data
调用返回的结果可以附加到该列表中。最终,在每次
get_data
调用中简单地使用
yield
会更干净。

我不确定什么是生成器,我对“yield”有点混淆。请详细说明您建议的解决方案的输出结果。我会非常感激的。谢谢,例如,如果我输入一个id,比如1000,我会得到错误indexer:list索引超出范围。我使用了一个try,除了像这样,```try:mylist=list(get_data(d,id_type))[0]@LauraSmith,这是因为生成器对象需要迭代(通过调用
list
或在其上循环)。如果在
myTodo
中找不到该值,将返回一个空列表,因为基本情况:
yield{i:d.get(i)for i in['taskid','taskstatus']}
从未执行。请看我最近的编辑,因为我添加了一个简单的更改来反映这种可能性。
{'taskid': '12', 'taskstatus': 'off'}