通过合并匹配的键和键,值对来折叠字典

时间:2018-05-26 03:59:18

标签: python

所以我试图找到一种方法来“合并”一个在python中以字典形式存在的依赖列表,但我还没有找到解决方案。因此,想象一下沿着这条线的图形:(所有的线都是这个有向图中的向下箭头)

@JsonFilter

此图表将生成一个如下所示的依赖关系字典:

1   2   4
 \ /   / \
  3   5   8
   \ / \   \
    6   7   9

这样键是图中的节点,它们的值是它们所依赖的节点。 我试图将它转换为树的总祖先列表,以便每个节点都是一个键,它的值是一个通向它的所有节点的列表,而不仅仅是它的直接父节点。结果字典将是:

{3:[1,2], 5:[4], 6:[3,5], 7:[5], 8:[4], 9:[8], 1:[], 2:[], 4:[]}

有关如何解决此问题的任何建议?我一直在敲打它一段时间,尝试了一种我无法工作的递归解决方案。

2 个答案:

答案 0 :(得分:2)

您可以将带有dict comprehension的链式list comprehension用于最多两个节点。

>>> {k: v + [item for i in v for item in d.get(i, [])] for k,v in d.items()}

{3: [1, 2],
 5: [4],
 6: [3, 5, 1, 2, 4],
 7: [5, 4],
 8: [4],
 9: [8, 4],
 1: [],
 2: [],
 4: []}

对于无限深度,您可以使用递归方法

def get_ant(node, d):
    if node:
        return d.get(node,[]) + [item for x in d.get(node, []) for item in get_ant(x, d) ]
    return []

然后,

>>> get_ant(6, d)
[3, 5, 1, 2, 10, 4]

获取所有案件:

>>> {k: get_ant(k, d) for k in d.keys()}

{3: [1, 2, 10],
 5: [4],
 6: [3, 5, 1, 2, 10, 4],
 7: [5, 4],
 8: [4],
 9: [8, 4],
 1: [10],
 2: [],
 4: []}

答案 1 :(得分:1)

这是一个非常简单的方法。

In [22]: a
Out[22]: {1: [], 2: [], 3: [1, 2], 4: [], 5: [4], 6: [3, 5], 7: [5], 8: [4], 9: [8]}

In [23]: final = {}

In [24]: for key in a:   
    ...:     nodes = set()
    ...:         
    ...:     for val in a[key]:
    ...:         nodes.add(val)
    ...:         if val in a:
    ...:             nodes.update(set(a[val]))
    ...:             
    ...:     final[key] = list(nodes)

In [25]: final
Out[25]: 
{1: [],
 2: [],
 3: [1, 2],
 4: [],
 5: [4],
 6: [3, 1, 2, 5, 4],
 7: [5, 4],
 8: [4],
 9: [8, 4]}