我的数据以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]
即使它正在工作,我还是考虑优化它并去阅读一些关于列表提取的文章,并且遇到了上述错误。
任何帮助,非常感谢。
答案 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理解中:
第一次迭代时,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'])]
在第二次迭代中,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']]