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

时间:2016-05-23 02:20:23

标签: python list dictionary indices

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

我能够非常轻松地在列表中的字典中访问该列表中的值。但是,由于列表中有很多元素,我必须使用for循环来完成它。基本上我的方法是检查列表中的dict中的列表中的1是否为索引(用户指定的数字)。如果是,则使用来自同一个字典的前两个键值对更新另一个列表。

所以,就像这样:

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'进行比较。它已被修复。谢谢。

3 个答案:

答案 0 :(得分:3)

当你这样做时

i

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

因此您无需i来获取该项目。 {{1}}本身就是项目。相应地更改您的代码

答案 1 :(得分:1)

问题是当你做

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}

答案 2 :(得分:0)

提示:调用listRaw [i]我必须是一个整数

let user = users[userIndex] as? UserEnt
let relationship = user.valueForKeyPath("hefthSejil") as? NSMutableSet
relationship.addObject(hefthEnt)

但是当你进行for循环时我不是0。

在你的尝试中 listRaw[0]['Value'][1] == 1 , 你的字典。是空的,因为(len(listRaw))的长度是...... 1所以你的迭代并没有真正迭代你的所有字典元素。

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