Python3:TypeError:list indices必须是整数或切片,而不是str

时间:2018-05-03 14:50:21

标签: python python-3.x list

我的数据以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]  

即使它正在工作,我还是考虑优化它并去阅读一些关于列表提取的文章,并且遇到了上述错误。

任何帮助,非常感谢。

3 个答案:

答案 0 :(得分:3)

为什么在简单的dict工作时会使用一个dicts列表?

servers={
   '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'],
   }

host_list = servers["mydev2"]

Dict查找是O(1)并且极其优化(在Python内部各处都使用了dicts)。列表查找是O(N)。

答案 1 :(得分:3)

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

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的所有元组(键,值)的列表。
所以对于我的代码,在dict理解中:

  1. 第一次迭代时,d等于{'mydev': ['192.168.56.101', '192.168.56.102', '192.168.56.103']}d.items()等于[('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'])]

答案 2 :(得分:1)

您所做的错误是您通过server_list访问列表selected_env中的元素,这是一个字符串。

server_list[selected_env]

上述声明导致您的错误。相反,您需要检查selected_env item是否server_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']]