获取列表中嵌套字典中唯一值的键

时间:2016-08-20 13:46:33

标签: python dictionary nested iteration

我有一个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;对于第二个函数,我不知道如何实现它

问题

  • 我如何分别修复我的问题,是否有更智能的方法来实现第一个功能?
  • 第二个函数的优秀实现是什么?

感谢您的帮助。

2 个答案:

答案 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,我可以访问节点对象(所有节点对象都存储在列表中)以访问对象属性。