Python:无法使用列表索引检查重复项

时间:2015-01-08 03:35:15

标签: python list python-3.x

由于某种原因,相同的方法适用于一个功能而不是另一个功能。已经运行的功能定义如下:

def is_unique1(lst):
    for item in lst:
        current_index = lst.index(item)
        if lst[current_index] in lst[current_index + 1:-1]:
            return False
    return True

您传入一个列表并检查它的唯一性,如果它是唯一的,那么return TRUE如果不是return FALSE。然而,我被要求创建另一个函数,除了这次复制列表并对其进行排序。然后迭代列表中值的每个索引,以检查该索引处的值是否等于下一个更高索引处的值。但无论输入什么,它都会保持返回TRUE。该函数如下所示:

def is_unique2 ( myList ):
    list_copy = list(myList)
    list_copy.sort()
    print(list_copy)
    for item in list_copy:
        index = list_copy.index(item)
        if list_copy[index] in list_copy[index + 1: -1]:
            return False
    return True

为什么会这样。我是否错误地使用了切片。我正在检查list_copy[index]的当前值是否在index + 1。我正在测试它:

print('\nTesting is_unique2')
print (is_unique2(['raisin', 'apricot', 'celery', 'carrot']) )
print (is_unique2(['raisin', 'apricot', 'raisin', 'carrot']) )

2 个答案:

答案 0 :(得分:3)

您的错误是检查if list_copy[index] in list_copy[index + 1: -1]检查列表中的最后项。

请记住,在Python中,它始终是“上限被排除”:因此somelist[a:b]somelist[a]包含到somelist[b] 排除 ...对于任何{ {1}}和a

轻松修复:在b中使用。 IOW,不给切片上限,因此切片将一直运行到列表的末尾。

顺便提一下,如果列表的项目是可清除的,那么您的方法非常可疑 - 在这种情况下,

list_copy[index + 1:]

会更快,也更不容易出错: - )

答案 1 :(得分:-1)

尝试使用此行而不是unique1的<-1索引列表:

lst[current_index] in lst[current_index + 1:None:-1]: