有没有一种合适的方法来更新字典并将该字典添加到列表中,而不会导致重复。这是用于netmiko的,我的目标是使其具有一点动态性和灵活性,特别是在命名方案方面。
#!/usr/bin/python
import re
hosts_info = []
host = {
'device_type': 'cisco_ios',
'ip': 'co-acc-sw',
'username': 'cisco',
'password': 'notapassword',
'secret': 'mrsecret'
}
for x in range(0, 4):
if x < 2:
host.update({"ip": "core-switch" + str(x)})
elif x > 2:
host.update({"ip": "access-switch" + str(x - 1)})
hosts_info.append(host)
print(hosts_info)当前输出为:
[{'device_type': 'cisco_ios', 'ip': 'access-switch2', 'username': 'cisco', 'password': 'notapassword', 'secret': 'mrsecret'},
{'device_type': 'cisco_ios', 'ip': 'access-switch2', 'username': 'cisco', 'password': 'notapassword', 'secret': 'mrsecret'},
{'device_type': 'cisco_ios', 'ip': 'access-switch2', 'username': 'cisco', 'password': 'notapassword', 'secret': 'mrsecret'},
{'device_type': 'cisco_ios', 'ip': 'access-switch2', 'username': 'cisco', 'password': 'notapassword', 'secret': 'mrsecret'}]我试着让它看起来像这样:
[{'device_type': 'cisco_ios', 'ip': 'core-switch1', 'username': 'cisco', 'password': 'notapassword', 'secret': 'mrsecret'},
{'device_type': 'cisco_ios', 'ip': 'core-switch2', 'username': 'cisco', 'password': 'notapassword', 'secret': 'mrsecret'},
{'device_type': 'cisco_ios', 'ip': 'access-switch1', 'username': 'cisco', 'password': 'notapassword', 'secret': 'mrsecret'},
{'device_type': 'cisco_ios', 'ip': 'access-switch2', 'username': 'cisco', 'password': 'notapassword', 'secret': 'mrsecret'}]如果我创建单独的字典,并将它们添加到单独的if语句中,我就可以让它工作,只是想知道是否有更好的方法来做到这一点?谢谢。
发布于 2020-06-18 00:43:34
列表中的每一项都需要是它自己的字典;您现有的代码只有一个字典(host),它会不断更新(覆盖以前的更新),并构建一个包含四个对同一字典的引用的列表。
创建一个新词典的一种简单方法是使用**olddict进行词典理解
for x in range(0, 4):
if x < 2:
hosts_info.append({**host, "ip": "core-switch" + str(x)})
elif x > 2:
hosts_info.append({**host, "ip": "access-switch" + str(x - 1)})
else:
hosts_info.append({**host})这更多的是你的原始代码试图做的(减去指针错误),但仍然不能实际产生你想要的输出,因为数学是错误的。
我认为让数学工作的方法可能更像这样:
hosts_info = [{
**host, "ip": f"core-switch{x+1}" if x < 2 else f"access-switch{x-1}"
} for x in range(4)]或者,不是试图通过计算某个范围内不同int值的偏移量来巧妙地设计单个循环来生成您想要的不同字符串值,您可以只做一个嵌套循环,在此循环中迭代您想要的实际值:
hosts_info = [{
**host, "ip": f"{switch}-switch{x}"
} for switch in ("core", "access") for x in (1, 2)]到目前为止,IMO的可读性要好得多,因为输出非常直接和明显地对应于代码,而复杂的数学运算甚至很难弄清楚原始代码试图生成什么(而且要让数学运算做正确的事情也不是件容易的事)。
发布于 2020-06-18 01:03:33
一个简单的解决方法是:
for x in range(0, 4):
h = dict(host)
if x < 2:
h.update({"ip": "core-switch" + str(x + 1)})
elif x >= 2:
h.update({"ip": "access-switch" + str(x - 1)})
hosts_info.append(h)因为你需要显式地复制你的字典。然而,我建议也看看Samwise的答案。
https://stackoverflow.com/questions/62434021
复制相似问题