Python __getitem__ 错误
我有个简单的问题,这行代码
row[time] == numbers[num_time]:
给我报了这个错:
int has no attribute __getitem__
经过一些研究,我发现这个错误发生在你试图用一个整数去调用列表中的元素。在我的例子里,我传入了一个包含3个数字的列表,然后想要递归(我们还不能用循环 :( )去检查第二个数字列表中的元素是否在第一个列表里。如果有,就会执行某些操作;如果没有,函数就应该继续检查下一个列表中的元素,重复这个过程,直到列表检查完毕。
def row_find(row,numbers,time,num_time):
if numbers==[]:
return row_find(row[time+1],numbers,time+1,num_time=0)
if row== []:
return row
else:
if row[time]== numbers[num_time]:
num_time=0
return row,row_find(row[time+1],numbers,time+1,num_time)
else:
return row,row_find(row[time],numbers[num_time+1],time,num_time)
lst=[5,2,9]
num_lst=[5, 10, 23, 31, 44]
row_find(lst,num_lst,0,0)
5 个回答
你需要做几件事情:
首先,检查一下你的参数(数字)是否真的是一个列表。在你的函数最上面加上这个:
if not isinstance(numbers, collections.Iterable):
# error! numbers is meant to be a list. report on this error somehow
然后,在你的代码后面:
比如说,num_lst=[5, 10, 23, 31, 44]
,那么num_lst[0] = 5
,而num_lst[0++] = 10
。如果“numbers”是10,那么numbers[num_time]
是什么意思呢?(也就是说,10[num_time]
- 这到底是什么意思?)。
与其把numbers[num_time+1]
作为参数传回你的函数,不如考虑使用切片。
这里:
return row,row_find(row[time],numbers[num_time+1],time,num_time)
你需要把一个整数作为 row_find
函数的 numbers
参数传入。但是你应该传入一个列表。你是在找 切片 吗?
你想要做的是
row_find(row[time],numbers[1:],time,num_time)
这里的[1:]表示从第二个元素开始返回一个列表。
你还可以使用Python的布尔值判断。如果一个序列是空的,它会被判断为False,所以你可以用下面的方式代替
if numbers==[]:
你可以这样做:
if not numbers:
检查一下你发送的 numbers
是什么,可能你发送的不是一个列表。你遇到的错误是 Python 在告诉你,你在错误的对象上使用了一个函数。attribute __getitem__
是用来获取列表 numbers
中某个位置的值,比如 numbers[1]
这样。
这里:
row_find(row[time],numbers[num_time+1],time,num_time)
你在使用 numbers[num_time+1]
,但这不是一个列表。
我觉得这样做应该能解决问题:
def row_find(row,numbers,time,num_time):
if numbers==[]: # If numbers list is empty, it make no sense to contiue
return False
if row== []: # If numbers list is empty, it make no sense to contiue
return False
if row[time]== numbers[num_time]: #Already found an element that is in both lists
print("found -> " + str(time) + " " + str(num_time))
return True
else:
if num_time < len(numbers)-1: # If remaining elements in numbers
if row_find(row,numbers,time,num_time+1): # Check next one
return True
else: # I
if time < len(row)-1: # If remaining element in row
return row_find(row,numbers,time+1,0) # check numbers from beginning with next row
else:
return False # If not, no elements in both lists
lst=[8,2,9]
num_lst=[9, 10, 88, 31, 55]
row_find(lst,num_lst,0,0)
# found -> 2 0