获取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'}