首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过合并匹配的键和键、值对折叠字典

通过合并匹配的键和键、值对折叠字典
EN

Stack Overflow用户
提问于 2018-05-26 03:59:17
回答 2查看 76关注 0票数 5

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

代码语言:javascript
运行
复制
1   2   4
 \ /   / \
  3   5   8
   \ / \   \
    6   7   9

此图将生成如下所示的依赖字典:

代码语言:javascript
运行
复制
{3:[1,2], 5:[4], 6:[3,5], 7:[5], 8:[4], 9:[8], 1:[], 2:[], 4:[]}

这样,键就是图中的节点,它们的值就是它们所依赖的节点。我试图用树的形式把它转换成一个总祖先列表,这样每个节点都是一个键,它的值是导致它的所有节点的列表,而不仅仅是它的直系亲属。由此产生的字典将是:

代码语言:javascript
运行
复制
{3:[1,2], 5:[4], 6:[3, 5, 1, 2, 4], 7:[5, 4], 8:[4], 9:[8, 4], 1:[], 2:[], 3:[]}

对如何解决这个问题有什么建议吗?我已经投入了一段时间,尝试了一种递归的解决方案,但我一直无法工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-26 05:03:21

您可以对最多两个节点使用带链式dict comprehensionlist comprehension

代码语言:javascript
运行
复制
>>> {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: []}

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

代码语言:javascript
运行
复制
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 []

然后,

代码语言:javascript
运行
复制
>>> get_ant(6, d)
[3, 5, 1, 2, 10, 4]

为了得到所有的案子:

代码语言:javascript
运行
复制
>>> {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: []}
票数 2
EN

Stack Overflow用户

发布于 2018-05-26 04:31:51

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

代码语言:javascript
运行
复制
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]}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50539199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档