将字典列表与一个键值匹配组合起来

时间:2021-03-28 16:11:11

标签: python-3.x list-comprehension dictionary-comprehension

listofdicts = [
{
    "if-e0": "e0",
    "ip-add-e0": "192.168.1.1",
    "name": "host1"
},
{
    "if-e1": "e1",
    "ip-add-e1": "192.168.2.1",
    "name": "host1"
},
{
    "if-e1": "e1",
    "ip-add-e1": "172.16.1.1",
    "name": "host2"
},
{
    "if-e2": "e2",
    "ip-add-e2": "172.16.2.1",
    "name": "host2"
}]

预期结果:

listofdicts = [
{
    "if-e0": "e0",
    "ip-add-e0": "192.168.1.1",
    "if-e1": "e1",
    "ip-add-e1": "192.168.2.1",
    "name": "host1"
},
{
    "if-e1": "e1",
    "ip-add-e1": "172.16.1.1",
    "if-e2": "e2",
    "ip-add-e2": "172.16.2.1",
    "name": "host2"
}]

一直在努力完成这项工作,但还没有运气,实际列表有超过 60K 的字典,具有独特且匹配的主机。

这可能更容易解决,但对我来说,过去几个小时一直是一场噩梦。

感谢您的帮助。

问候, 阿维纳什

3 个答案:

答案 0 :(得分:0)

图论在这里似乎很有帮助。

要解决这个问题,您需要构建一个图,其中每个顶点都与输入列表中的一个字典相关。

如果对应字典中有一个公共键值对,则两个顶点之间应该有一条边(更具体地说,对于字典 d1d2,如果 {{1 }} 或者更简单的,如果 len(set(d1.items()).intersection(d2.items())) != 0。条件意味着在 set(d1.items()).intersection(d2.items())d1 的项目集的交集中至少有一个键值对)。

图建好后,你需要找到所有的连通性组件(这是一个非常简单的DFS(深度优先搜索),如果你不熟悉图算法,你可以谷歌它)。每个连接组件的字典应该合并为一个:每个组件应该有一个结果字典。这些生成的字典列表就是您的答案。

以下是如何组合一些字典的示例:

d2

答案 1 :(得分:0)

@Kolay.Ne 嗨,大家好, 它确实与一个非常基本的捕获一起工作。尽管我使用了以下有效的方法 n,但图形方法非常适合解决它:

for d in listofdicts:
    x = listofdicts.index(d)
    for y in range(len(listofdicts)):
        k = 'name'
        if y != x and y < len(listofdicts):
            if listofdicts[x][k] == listofdicts[y][k]:
                dc = copy.deepcopy(listofdicts[y])
                listofdicts[x].update(dc)
                listofdicts.remove(dc)

可能是其他方法来解决它,我确定病态的方法只是几行,这解决了我手头工作的问题。

感谢 kolay.Ne 快速响应并尝试提供帮助,图方法也很棒,需要专业编码,并且肯定会更具可扩展性。

答案 2 :(得分:-2)

ems.c