Python __getitem__ 错误

1 投票
5 回答
1467 浏览
提问于 2025-04-17 21:11

我有个简单的问题,这行代码

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 个回答

0

你需要做几件事情:

首先,检查一下你的参数(数字)是否真的是一个列表。在你的函数最上面加上这个:

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]作为参数传回你的函数,不如考虑使用切片。

0

这里:

return row,row_find(row[time],numbers[num_time+1],time,num_time)

你需要把一个整数作为 row_find 函数的 numbers 参数传入。但是你应该传入一个列表。你是在找 切片 吗?

0

你想要做的是

row_find(row[time],numbers[1:],time,num_time)

这里的[1:]表示从第二个元素开始返回一个列表。

你还可以使用Python的布尔值判断。如果一个序列是空的,它会被判断为False,所以你可以用下面的方式代替

if numbers==[]:

你可以这样做:

if not numbers:
1

检查一下你发送的 numbers 是什么,可能你发送的不是一个列表。你遇到的错误是 Python 在告诉你,你在错误的对象上使用了一个函数。attribute __getitem__ 是用来获取列表 numbers 中某个位置的值,比如 numbers[1] 这样。

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

撰写回答