为什么我的词典菜单没有出现?

时间:2020-05-02 03:01:12

标签: python json dictionary object

我正在尝试显示一组路由器的菜单,该菜单由字典描述,其中包含有关其状态的信息。为此,我有一个函数将包含设备信息的字典CanCluster作为输入。字典通过使用for循环转换为字典对象列表,称为CanCluster,按设备名称的值排序。所有设备都保存到routers变量中,该变量又用于枚举和打印设备。

运行此代码时出现此错误:

router_list

这是我的代码:

menu_text

2 个答案:

答案 0 :(得分:1)

使用enumerate()遍历字典时,您会得到索引和键,而不是键和值。并且,value['name']会导致错误,因为value不代表字典,而是键(在您的情况下,nameip等)。< / 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的参数应该是词典列表。