【发布时间】:2016-12-27 13:07:51
【问题描述】:
我有一个字典,其中包含具有以下结构的元素
{'task0': {'id': 0, 'successor':[<other elements>]}
每个元素都包含一个唯一的 id 和所提及元素的后继列表。也可以为空,这意味着该元素没有后继。
示例
a = {'task0': {'node_id': 0, 'successor': [{'task1': {'node_id': 1, 'successor': [{'task2': {'node_id': 2, 'successor': [{'task4': {'node_id': 4, 'successor': []}}, {'task5': {'node_id': 5, 'successor': []}}]}}, {'task3': {'node_id': 3, 'successor': []}}]}}]}}
我想要什么
def get_node_name_by_id(obj, id_search)
示例:def get_node_name_by_id(a, 3) == 'task3'
def get_parent_id_by_child_id(obj, id_search)
示例:def get_parent_id_by_child_id(a, 3) == 1
我目前所拥有的
def get_node_name_by_id(obj, id_search):
for k,v in obj.iteritems():
if isinstance(v,dict):
if v['node_id'] is id_search:
return k
elif v['successor']:
for e in v['successor']:
return get_node_name_by_id(e, id_search)
-> 问题:如果我正在搜索的 id 不在列表的第 1 位,我会得到 None 作为结果。
-> 对于第二个功能,我不知道如何实现它
问题
- 我该如何分别解决我的问题,是否有更智能的方法来实现第一个功能?
- 第二个函数的最佳实现是什么?
感谢您的帮助。
【问题讨论】:
-
为什么 task1 和 task2 有 '[' ,它是字典中的列表吗?
-
是的,包含字典的列表(也可以包含带有列表的字典)
-
if v['id'] is id?is而不是in?我不推荐id,因为它是保留关键字。请提供一个可验证的示例,其中包含您的 dict 中的真实数据。 -
@Jean-FrançoisFabre:
id()是一个内置函数,而不是关键字。如果您只想使用内置的,屏蔽它可能是个问题。 -
你是对的。无论如何都不是一个好习惯(好吧,谁使用
id?)
标签: python dictionary nested iteration