Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么我的字典菜单没有出现?_Python_Json_Dictionary_Object - Fatal编程技术网

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

Python 为什么我的字典菜单没有出现?,python,json,dictionary,object,Python,Json,Dictionary,Object,我试图显示一组路由器的菜单,该菜单由一个字典描述,其中包含有关其状态的信息。为此,我有一个函数,它将包含设备信息的字典路由器作为输入。字典被转换成字典对象列表,称为router\u list,使用for循环,按设备名称的值排序。所有设备都保存在菜单\u text变量中,该变量反过来用于枚举和打印设备 运行此代码时,出现以下错误: python3 menu.py Traceback (most recent call last): File "menu.py", line 28, in &

我试图显示一组路由器的菜单,该菜单由一个字典描述,其中包含有关其状态的信息。为此,我有一个函数,它将包含设备信息的字典
路由器
作为输入。字典被转换成字典对象列表,称为
router\u list
,使用for循环,按设备名称的值排序。所有设备都保存在
菜单\u text
变量中,该变量反过来用于枚举和打印设备

运行此代码时,出现以下错误:

 python3 menu.py 
Traceback (most recent call last):
  File "menu.py", line 28, in <module>
    'password': '2020'
  File "menu.py", line 6, in show_menu
    router_list.append("%s. %s " % ((i+2), value['name'],))
TypeError: string indices must be integers

例如,您应该将词典列表传递给
show_menu()

路由器=[
{
“名称”:“cisco_ios”,
‘ip’:‘192.168.122.217’,
“用户名”:“管理员”,
“密码”:“2020”
},
]
显示菜单(路由器)

原因是,在
show_menu()
code中,您假设
value
是一个字典,因此
路由器的参数应该是一个字典列表。

当使用
enumerate()
在字典上循环时,您得到的是索引和键,而不是键和值。而且,
value['name']
将导致错误,因为
value
不代表字典,它是键(
name
ip
,在您的情况下,等等)

要在键/值对上循环,可以使用
dict.items()
如下所示:

for k, v in dict.items():
    print(k, v)
相关线程:


由于您只将一个路由器信息作为字典传递,即
路由器
,因此不需要在其上循环以提取路由器的名称

您只需使用
路由器['name']
就可以了

示例():

输出:

---------------------------------------------------------
0.EXIT
1.CONFIG ALL
2.cisco_ios
---------------------------------------------------------
---------------------------------------------------------
0.EXIT
1.CONFIG ALL
2. cisco_ios 
3. cisco_ios_123 
---------------------------------------------------------
但是,如果有多个路由器,那么您可以使用表示路由器的字典列表,并使用
for
对其进行循环,如下所示():

输出:

---------------------------------------------------------
0.EXIT
1.CONFIG ALL
2.cisco_ios
---------------------------------------------------------
---------------------------------------------------------
0.EXIT
1.CONFIG ALL
2. cisco_ios 
3. cisco_ios_123 
---------------------------------------------------------

您打算使用多少路由器信息?菜单将只显示路由器的
名称
,对吗?这是否回答了您的问题?这取决于环境,长官,实际上,我想用另一个函数,通过从列表菜单中选择一个数字,对拓扑结构进行一些配置。是的,我想你,但实际上,我想与另一个函数一起使用,通过从列表菜单中选择一个数字来指示哪些设备延迟响应。我不是很清楚你的需要,但是如果你想用一个号码来选择一个路由器,那么路由器字典的列表应该可以工作,因为列表索引可以与路由器号码相同。这是真的,但我必须列举这些dict用于selecting@AbdelhakBoumezrag:为什么?你是如何得到路由器信息字典的?如果有多个路由器,你会得到什么?一本包含所有路由器的字典?是这样吗?
---------------------------------------------------------
0.EXIT
1.CONFIG ALL
2. cisco_ios 
3. cisco_ios_123 
---------------------------------------------------------