列表索引必须是整数或切片,而不是Dict



我正在做一些操作,这些操作涉及从每个元素都是字典的列表中提取数据。每个字典包含两个键值对,它们是一个字符串,然后是一个int(即{'ID':0,'邮政编码':9414}),然后是密钥是字符串的键值对,然后是列表({'value':[0,0,1,1,0,1]})

我可以很容易地在列表中的字典中访问该列表中的值。然而,由于列表中有一堆元素,我必须使用for循环来遍历它。基本上,我的方法是检查列表中dict中该列表中的索引(用户指定的数字)是否有1。如果是,它会用同一个dict的前两个键值对更新另一个列表

所以,像这样:

import returnExternalList #this method returns a list generated by an external method
def checkIndex(b):
listFiltered = {}
listRaw = returnExternalList.returnList #runs the method "returnList", which will return the list
for i in listRaw:
if listRaw[i]['Value'][b] == 1:
filteredList.update({listRaw[i]['ID']: listRaw[i]['Zip Code']})
print(filteredList)
checkIndex(1)
returnExternalList.returnList:
[{'ID':1 ,'Zip Code':1 ,'Value':[0,1,0,0,1]},{'ID':2 ,'Zip Code':2 ,'Value':[0,0,0,0,0]},{'ID':3,'Zip Code':3 ,'Value':[0,1,1,1,0]},{'ID':4 ,'Zip Code':4 ,'Value':[1,0,0,0,0]}]
expected output:
[{1:1 , 3:3}]

我可以访问字典中的列表中的值,在for循环的列表外部中,只需执行以下操作:

print(listRaw[0]['Value'][1]) would return 1, for example.

然而,当试图用for循环复制这种行为以检查列表中的每一个时,我会得到错误:

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

我该怎么办?

编辑:由于被要求,returnExternalList:

def returnList:
listExample = [{'ID':1 ,'Zip Code':1 ,'Value':[0,1,0,0,1]},{'ID':2 ,'Zip Code':2 ,'Value':[0,0,0,0,0]},{'ID':3,'Zip Code':3 ,'Value':[0,1,1,1,0]},{'ID':4 ,'Zip Code':4 ,'Value':[1,0,0,0,0]}]
return listExample  

编辑:我使用了下面提供的两个解决方案,虽然它确实消除了错误(谢谢!),但输出只是一个空白字典。

代码:

for i in listRaw:
if i['Value'][b] == 1:
filteredList.update({i['ID']: i['Zip Code']})
or
for i in range(len(listRaw):
if listRaw[i]['Value'][b] == 1:
filteredList.update({listRaw[i]['ID']: listRaw[i]['Zip Code']}) 

编辑:

它现在起作用了,列表为空的原因是我将1与"1"进行了比较。它已经修复了。非常感谢。

进行时

for i in listRaw:

i不是索引,它是列表中的实际项目(在您的情况下,它是dict)

因此,您不必执行listRaw[i]即可获得该项目。i本身就是项目。相应地更改您的代码

问题是,当您执行时

for i in listRaw:

这不会在i中为您提供ist索引,而是为您提供了列表中的实际字典。循环的每次迭代都会为您提供列表中的下一个字典。你可以这样做来修复它:

def checkIndex(b):
filteredList = {}
listRaw = returnExternalList.returnList #runs the method "returnList", which will return the list
for d in listRaw:
if d['Value'][b] == 1:
filteredList.update({d['ID']: d['Zip Code']})
print(filteredList)

但整个事情可以更简洁地写成字典理解:

def checkIndex(b):
print({d['ID']: d['Zip Code'] for d in returnExternalList.returnList if d['Value'][b] == 1})

我倾向于让你的函数接受列表作为参数,而不是访问全局变量,并返回结果:

def check_index(index, return_list):
return {d['ID']: d['Zip Code'] for d in return_list if d['Value'][index] == 1}
>>> print(check_index(1, returnExternalList.returnList))
{1: 1, 3: 3}

提示:要调用listRaw[i]i,必须是整数

listRaw[0]['Value'][1] == 1

但是当你做for循环时,我不是0。

在你的尝试中CCD_ 6,你的dict.是空的,因为(len(listRaw))的长度是…1,所以你的迭代并不是真的在所有字典元素上迭代。

考虑在代码中添加一些打印以帮助调试,这在启动时非常方便

相关内容

  • 没有找到相关文章

最新更新