列表索引超出范围-在排序列表中查找重复项

时间:2018-12-18 22:24:20

标签: python

我是Python的新手,仅使用PHP和前端语言,因此Python语法使我感到困惑。

作为一项简单的任务,我想检查已排序列表中的重复项,如果找到了重复项,则返回true,而无需遍历列表的其余部分。

每次尝试执行此操作时,我都会收到

  

IndexError:列表索引超出范围

消息。

代码:

    for n in range(len(numbers)):
        if numbers[n+1] < len(numbers):
            if numbers[n] == numbers[n+1]:
                return True
    return False

我在这里做错了什么?我猜错了,这意味着我正在尝试访问列表中不存在的索引,但是我认为if numbers[n+1] <= len(numbers):意味着我将检查除最后​​一个索引之外的所有其他索引(该索引超出范围)如果我这样做的话。)

编辑:尽管有很多方法可以更改列表并删除重复项(即集合),但我目前正在学习Python的基本语法和工作原理,因此最好使用列表本身。

6 个答案:

答案 0 :(得分:2)

您可以简单地转换以设置和比较len

def check_no_duplicates(numbers):
    return len(numbers) == len(set(numbers))

如果没有重复项,将返回True,否则将返回False

编辑:如果您的列表由可哈希对象组成,例如诠释如果列表中的元素不可散列,例如列表。假设列表中有数字,那不是问题。

答案 1 :(得分:2)

您根本不需要索引。用自己的尾巴压缩列表,然后查找重复的元组:

from itertools import slice
for x, y in zip(numbers, islice(numbers, 1, None)):
    if x == y:
        return True
return False

使用索引,很简单

for i in range(len(numbers) - 1):
    if numbers[i] == numbers[i+1]:
        return True
return False

您需要确保i从未设置为最后一个索引,以使numbers[i+1]不能尝试访问数组末尾的元素。

答案 2 :(得分:1)

您可以先对列表进行排序,然后检查是否找到任何重复的元素。

如果列表包含[1, 2, 1, 4, 5, 3, 2]

my_list.sort()  # will return [1, 1, 2, 2, 3, 4, 5]
for i in range(len(my_list) - 1):
    if my_list[i] == my_list[i+1]:  
      return true

return false

答案 3 :(得分:0)

使用set()

numbers = [1,2,3,4,1]
newnums = set(numbers)
print (len(newnums) == len(numbers))
#True if the length is the same, False if the length is different

要将其放入函数中,请参见@buran的answer并使用以下命令进行调用:

check_no_duplicates(numbers)

答案 4 :(得分:0)

获得IndexError的原因是,通过使用numbers[n+1],您正在访问列表边界之外的值。

获取没有重复项的列表的最简单方法是将其转换为set,这会自动删除重复项:

mylist = [1,2,3,1,2,3]
myset = set(mylist) #myset is [1,2,3]

然后可以通过将其与myset的列表版本进行比较来检查原始列表中是否存在重复项:

duplicatesinlist = mylist == list(myset)

答案 5 :(得分:0)

def contains_duplicate(numbers):
    for n in range(len(numbers) - 1):          # see -1 in it
        if numbers[n] == numbers[n+1]:         # note: omitting your previous statement
            return True
    return False

测试:

print(contains_duplicate([1, 2, 3, 3, 5, 8]))
print(contains_duplicate([1, 2, 3, 5, 7, 8]))

输出:

True
False