首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python更新字典并使用循环将其追加到列表末尾

Python更新字典并使用循环将其追加到列表末尾
EN

Stack Overflow用户
提问于 2020-06-18 00:39:11
回答 2查看 41关注 0票数 0

有没有一种合适的方法来更新字典并将该字典添加到列表中,而不会导致重复。这是用于netmiko的,我的目标是使其具有一点动态性和灵活性,特别是在命名方案方面。

代码语言:javascript
复制
#!/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)

当前输出为:

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

我试着让它看起来像这样:

代码语言:javascript
复制
[{'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语句中,我就可以让它工作,只是想知道是否有更好的方法来做到这一点?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-18 00:43:34

列表中的每一项都需要是它自己的字典;您现有的代码只有一个字典(host),它会不断更新(覆盖以前的更新),并构建一个包含四个对同一字典的引用的列表。

创建一个新词典的一种简单方法是使用**olddict进行词典理解

代码语言:javascript
复制
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})

这更多的是你的原始代码试图做的(减去指针错误),但仍然不能实际产生你想要的输出,因为数学是错误的。

我认为让数学工作的方法可能更像这样:

代码语言:javascript
复制
hosts_info = [{
    **host, "ip": f"core-switch{x+1}" if x < 2 else f"access-switch{x-1}"
} for x in range(4)]

或者,不是试图通过计算某个范围内不同int值的偏移量来巧妙地设计单个循环来生成您想要的不同字符串值,您可以只做一个嵌套循环,在此循环中迭代您想要的实际值:

代码语言:javascript
复制
hosts_info = [{
    **host, "ip": f"{switch}-switch{x}"
} for switch in ("core", "access") for x in (1, 2)]

到目前为止,IMO的可读性要好得多,因为输出非常直接和明显地对应于代码,而复杂的数学运算甚至很难弄清楚原始代码试图生成什么(而且要让数学运算做正确的事情也不是件容易的事)。

票数 1
EN

Stack Overflow用户

发布于 2020-06-18 01:03:33

一个简单的解决方法是:

代码语言:javascript
复制
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的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62434021

复制
相关文章

相似问题

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