[英]Merging a list of dictionaries based on common key values but with nested dict of lists
[英]Getting key of unique values in a nested dict within lists
我有一個字典,其中包含具有以下結構的元素
{'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
。
->對於第二個功能,我不知道如何實現
題
謝謝你的幫助。
我們之前沒有看到的明顯問題是您的內部循環中的無條件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
根據tobias_k的評論,我發現了一種存儲信息的簡便方法。 因為每個節點對象都有一個唯一的ID,所以僅存儲這些ID就足夠了。 每個子列表的索引是為其定義后繼節點的節點的索引。
successor_list = [[successors_node0], [successors_node1], [successors_node2], ..., [successors_nodeN]]
借助ID,我可以訪問節點對象(所有節點對象都存儲在列表中)以訪問對象屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.