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 的字典,具有独特且匹配的主机。
这可能更容易解决,但对我来说,过去几个小时一直是一场噩梦。
感谢您的帮助。
问候, 阿维纳什
答案 0 :(得分:0)
图论在这里似乎很有帮助。
要解决这个问题,您需要构建一个图,其中每个顶点都与输入列表中的一个字典相关。
如果对应字典中有一个公共键值对,则两个顶点之间应该有一条边(更具体地说,对于字典 d1
和 d2
,如果 {{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