Python3:TypeError:列表索引必须是整数或切片,而不是 str

新手上路,请多包涵

我的数据以 json 格式存储。通过使用 json:load() 我正在读取数据。

我想做的是基于传递的参数,我试图从列表中提取 Key:Value 的特定部分并将它们存储到一个新列表中以供以后处理。

代码

selected_env='mydev2'
server_list=[{'mydev': ['192.168.56.102', '192.168.56.102', '192.168.56.102']}, {'mydev2': ['192.168.56.102', '192.168.56.102', '192.168.56.102']}]
for item in server_list :
    host_list=[item for item in server_list[selected_env] if selected_env in server_list]

print(host_list)

我收到错误信息

TypeError: list indices must be integers or slices, not str

注意:我已经实现了一种提取方式,如下所示

for item in server_list:
  for element in item :
    if element == selected_env :
       host_list=item[selected_env]

即使它有效,我还是想对其进行优化,并阅读了一些有关列表提取的文章,并且遇到了上述错误。

任何帮助,不胜感激。

原文由 Raja G 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 790
2 个回答

如果您的输入数据必然是字典列表,我建议您先将其转换为单个字典,使用很好的字典理解,如下所示:

 selected_env='mydev2'
server_list=[{'mydev': ['192.168.56.101', '192.168.56.102', '192.168.56.103']}, {'mydev2': ['192.168.56.104', '192.168.56.105', '192.168.56.106']}]

server_dict = {k:v for d in server_list for k,v in d.items()}
host_list = server_dict[selected_env]

print(host_list)

笔记:

d.items() 返回包含字典所有元组(键,值)的列表 d

所以对于我的代码,在字典理解中:

  1. On 1st iteration, d equals {'mydev': ['192.168.56.101', '192.168.56.102', '192.168.56.103']} and d.items() equals [('mydev',['192.168.56.101', '192.168.56.102', '192.168.56.103'])]

  2. 在第二次迭代中, d 等于 {'mydev2': ['192.168.56.104', '192.168.56.105', '192.168.56.106']}d.items() 等于 [('mydev2',['192.168.56.104', '192.168.56.105', '192.168.56.106'])]

原文由 Laurent H. 发布,翻译遵循 CC BY-SA 4.0 许可协议

你做错了什么是你正在访问列表中的元素 server_list by selected_env 这是一个字符串。

 server_list[selected_env]

上面的语句导致了你的错误。相反,您需要检查 selected_env 是否在 itemserver_list 中。

这应该工作:

 selected_env='mydev2'
server_list=[{'mydev': ['192.168.56.102', '192.168.56.102', '192.168.56.102']}, {'mydev2': ['192.168.56.102', '192.168.56.102', '192.168.56.102']}]
for item in server_list :
    host_list = [item[selected_env] for item in server_list if selected_env in item]
host_list = list(itertools.chain(*host_list)) # To convert sub-list into flat
# assumed as import itertools included

print(host_list)
# [['192.168.56.102', '192.168.56.102', '192.168.56.102']]

原文由 Austin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题