我是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的基本语法和工作原理,因此最好使用列表本身。
答案 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