gpt4 book ai didi

python - 递归组合字典

转载 作者:太空狗 更新时间:2023-10-29 21:48:10 24 4
gpt4 key购买 nike

好吧,这让我费尽心思。我有两个包含对象组的字典,如下所示:

groups = {
'servers': ['unix_servers', 'windows_servers'],
'unix_servers': ['server_a', 'server_b', 'server_group'],
'windows_servers': ['server_c', 'server_d'],
'server_group': ['server_e', 'server_f']
}

hosts = {
'server_a': '10.0.0.1',
'server_b': '10.0.0.2',
'server_c': '10.0.0.3',
'server_d': '10.0.0.4',
'server_e': '10.0.0.5',
'server_f': '10.0.0.6'
}

我正在寻找的输出是:

d3 = {
'servers': {
'unix_servers': {
'server_a': '10.0.0.1',
'server_b': '10.0.0.2',
'server_group': {
'server_e': '10.0.0.5',
'server_f': '10.0.0.6'
}
},
'windows_servers': {
'server_c': '10.0.0.3',
'server_d': '10.0.0.4'
}
}
}

我遇到的问题是我事先不知道有多少递归级别,因为嵌套组在理论上可以无限继续下去。此外,我无法确定哪些键应该是组合字典中的顶级键。

我目前有以下内容:

def resolve(d1, d2):
for k, v in d1.items():
for i in v:
if i in d2.keys():
d3[k] = {i: d2[i]}

返回:

{
"servers": {
"unix_servers": {
"server_a": "10.0.0.1",
"server_b": "10.0.0.2",
"server_group": {
"server_e": "10.0.0.5",
"server_f": "10.0.0.6"
}
},
"windows_servers": {
"server_c": "10.0.0.3",
"server_d": "10.0.0.4"
}
},
"unix_servers": {
"server_b": "10.0.0.2"
},
"windows_servers": {
"server_d": "10.0.0.4"
},
"server_group": {
"server_f": "10.0.0.6"
}
}

这很接近,但它显然缺少递归并且不处理键的嵌套。主要是在这里寻找指针,递归逻辑还没有为我点击...

最佳答案

我认为这可以满足您的需求:

def resolve(groups, hosts):
# Groups that have already been resolved
resolved_groups = {}
# Group names that are not root
non_root = set()
# Make dict with resolution of each group
result = {}
for name in groups:
result[name] = _resolve_rec(name, groups, hosts, resolved_groups, non_root)
# Remove groups that are not root
for name in groups:
if name in non_root:
del result[name]
return result

def _resolve_rec(name, groups, hosts, resolved_groups, non_root):
# If group has already been resolved finish
if name in resolved_groups:
return resolved_groups[name]
# If it is a host finish
if name in hosts:
return hosts[name]
# New group resolution
resolved = {}
for child in groups[name]:
# Resolve each child
resolved[child] = _resolve_rec(child, groups, hosts, resolved_groups, non_root)
# Mark child as non-root
non_root.add(child)
# Save to resolved groups
resolved_groups[name] = resolved
return resolved

以你的例子:

groups = {
'servers': ['unix_servers', 'windows_servers'],
'unix_servers': ['server_a', 'server_b', 'server_group'],
'windows_servers': ['server_c', 'server_d'],
'server_group': ['server_e', 'server_f']
}

hosts = {
'server_a': '10.0.0.1',
'server_b': '10.0.0.2',
'server_c': '10.0.0.3',
'server_d': '10.0.0.4',
'server_e': '10.0.0.5',
'server_f': '10.0.0.6'
}

d3 = {
'servers': {
'unix_servers': {
'server_a': '10.0.0.1',
'server_b': '10.0.0.2',
'server_group': {
'server_e': '10.0.0.5',
'server_f': '10.0.0.6'
}
},
'windows_servers': {
'server_c': '10.0.0.3',
'server_d': '10.0.0.4'
}
}
}


print(resolve(groups, hosts) == d3)
# True

请注意,对于格式错误的输入,这可能会陷入无限递归,例如,如果您的 A 组包含 B 组,但 ​​B 组包含组 A

关于python - 递归组合字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55236698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com