簡體   English   中英

在列表中的嵌套字典中獲取唯一值的鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM