我正在尝试显示一组路由器的菜单,该菜单由字典描述,其中包含有关其状态的信息。为此,我有一个函数将包含设备信息的字典CanCluster
作为输入。字典通过使用for循环转换为字典对象列表,称为CanCluster
,按设备名称的值排序。所有设备都保存到routers
变量中,该变量又用于枚举和打印设备。
运行此代码时出现此错误:
router_list
这是我的代码:
menu_text
答案 0 :(得分:1)
使用enumerate()
遍历字典时,您会得到索引和键,而不是键和值。并且,value['name']
会导致错误,因为value
不代表字典,而是键(在您的情况下,name
,ip
等)。< / p>
要遍历键/值对,可以像这样使用dict.items()
:
for k, v in dict.items():
print(k, v)
相关线程:enumerate() for dictionary in python
由于您仅传递一个路由器信息作为字典,即routers
,因此您无需遍历该信息即可提取路由器的名称。
您只需使用routers['name']
就可以了!
示例(live):
def show_menu(routers):
print(("""
---------------------------------------------------------
0.EXIT
1.CONFIG ALL
2."""+ routers['name'] +"""
---------------------------------------------------------
"""))
if __name__ == '__main__':
show_menu({
'name': 'cisco_ios',
'ip': '192.168.122.217',
'username': 'admin',
'password': '2020'
})
输出:
---------------------------------------------------------
0.EXIT
1.CONFIG ALL
2.cisco_ios
---------------------------------------------------------
但是,如果有多个路由器,则可以使用表示路由器的字典列表,并使用for
这样遍历它(live):
def show_menu(routers):
router_list = []
i = 0
for router in routers:
router_list.append("%s. %s " % ((i+2), router['name'],))
i = i + 1
menu_text = '\n'.join(router_list)
print(("""
---------------------------------------------------------
0.EXIT
1.CONFIG ALL
"""+ menu_text +"""
---------------------------------------------------------
"""))
if __name__ == '__main__':
show_menu([{
'name': 'cisco_ios',
'ip': '192.168.122.217',
'username': 'admin',
'password': '2020'
},
{
'name': 'cisco_ios_123',
'ip': '192.168.xxx.xxx',
'username': 'admin',
'password': '2021'
}
])
输出:
---------------------------------------------------------
0.EXIT
1.CONFIG ALL
2. cisco_ios
3. cisco_ios_123
---------------------------------------------------------
答案 1 :(得分:0)
例如,您应该将字典列表传递给show_menu()
routers = [
{
'name': 'cisco_ios',
'ip': '192.168.122.217',
'username': 'admin',
'password': '2020'
},
]
show_menu(routers)
原因是,在您的show_menu()
代码中,您假设value
是一个字典,因此routers
的参数应该是词典列表。