因此,我试图找到一种“合并”依赖列表的方法,该列表以python中的字典形式存在,而且我还没有想出一个解决方案。因此,想象一下沿着这条线的一个图:(所有的线都是这个有向图中向下指向的箭头)
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:[]}这样,键就是图中的节点,它们的值就是它们所依赖的节点。我试图用树的形式把它转换成一个总祖先列表,这样每个节点都是一个键,它的值是导致它的所有节点的列表,而不仅仅是它的直系亲属。由此产生的字典将是:
{3:[1,2], 5:[4], 6:[3, 5, 1, 2, 4], 7:[5, 4], 8:[4], 9:[8, 4], 1:[], 2:[], 3:[]}对如何解决这个问题有什么建议吗?我已经投入了一段时间,尝试了一种递归的解决方案,但我一直无法工作。
发布于 2018-05-26 05:03:21
您可以对最多两个节点使用带链式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: []}发布于 2018-05-26 04:31:51
这是一个非常简单的方法。
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]}https://stackoverflow.com/questions/50539199
复制相似问题