我有一个dict,其中包含具有以下结构的元素
{'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)
- &GT;问题:如果我正在搜索的ID不在列表的第1位,那么我得到None
。
- &GT;对于第二个函数,我不知道如何实现它
问题
感谢您的帮助。
答案 0 :(得分:0)
我们之前没有看到的明显问题是你的内循环中的无条件return
语句。
只有当它不是None
时才必须返回内容,否则忽略列表中除第一项以外的其他项目。
(注意我已将iteritems
更改为items
,因为它与python 3兼容,并且也适用于最新的python 2.7版本)
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):
for k,v in obj.items():
if isinstance(v,dict):
if v['node_id'] is id_search:
return k
elif v['successor']:
for e in v['successor']:
r = get_node_name_by_id(e, id_search)
if r:
return r
print(get_node_name_by_id(a, 3))
输出:
task3
答案 1 :(得分:0)
根据tobias_k评论,我找到了一种更简单的方法来存储信息。 由于每个节点对象都有唯一的ID,因此仅存储这些ID就足够了。 每个子列表的索引是节点的索引,为其定义了后继。
successor_list = [[successors_node0], [successors_node1], [successors_node2], ..., [successors_nodeN]]
借助ID,我可以访问节点对象(所有节点对象都存储在列表中)以访问对象属性。