Python 如果列表有重复项,如何返回布尔语句?

Python 如果列表有重复项,如何返回布尔语句?,python,Python,如何使用列表l中的for循环等进行编码以返回False或True 我是否应该有一个计数器来计数重复的数据?我在想我可以用点计数法来计算它们的重复数。如果计数超过2,则返回False l = [1, 2, 2, 3, 4, 4] def allDifferent1D(l): for i in l: print(l.count(i)) if l.count(i) > 1: return False 现在这又回来了: 1 2

如何使用列表
l
中的
for
循环等进行编码以返回
False
True

我是否应该有一个计数器来计数重复的数据?我在想我可以用点计数法来计算它们的重复数。如果计数超过
2
,则返回
False

l = [1, 2, 2, 3, 4, 4]

def allDifferent1D(l):
    for i in l:
        print(l.count(i))
        if l.count(i) > 1:
            return False
现在这又回来了:

1
2

试试看,这是一种更简单的方法,不需要显式循环——它使用了一个事实,即根据定义,集合不允许重复。如果列表和集合的元素数相同,那是因为没有重复的元素:

def allDifferent1D(lst):
    return len(lst) == len(set(lst))
如果
lst
列表中存在重复项,则上述函数将返回
False
;如果所有元素都是唯一的,且不需要对输入列表进行排序,则上述函数将返回
True
。例如:

allDifferent1D([1, 2, 2, 3, 4, 4])
=> False
allDifferent1D([1, 2, 3, 4, 5, 6])
=> True

保留看到的一组值,并在看到重复值时立即返回
False

def all_different(l):
    seen = set()
    for i in l:
        if i in seen:
            return False
        seen.add(i)
    return True
一种简化方法是只需一次性创建
set()
,并测试长度;较短的一组表示存在重复项。这会做更多的工作;对于大型列表,上述方法更有效,因为它会短路;一旦发现重复项,立即返回
False


请注意,每次创建二次算法时,计数方法都会扫描整个列表;将元素添加到列表中时,工作量会成倍增加。

这种方法将生成一个具有O(nlogn)灵活性和O(1)空间的解决方案

当您对列表排序时,重复的值应该是相邻的,而不使用集合来存储我们已经看到的项,我们可以使用O(1)-空间算法

当我们对元素进行排序时(假设Python使用最佳排序算法),复杂性是
O(nlogn)
。我们遍历列表,在最坏的情况下,我们遍历所有列表
O(n)
。所以在这种情况下,我们有
O(nlogn)
复杂度算法

l = [1,2,2,3,4,4]

def isDup(l):
    l=sorted(l)
    index=0
    isFound=False
    while not isFound and index<len(l)-2:
        if l[index+1]==l[index]:
            isFound=True
        else:
            index+=1
    return isFound

print isDup(l)
l=[1,2,2,3,4,4]
def isDup(升):
l=已排序(l)
索引=0
isFound=False
虽然未找到,但索引这里是简单的:

 >>> def dup_check(l):
         return sorted(l) == sorted(set(l))

 >>> dup_check([1,2,3,8,1])
 False
 >>> dup_check([1,2,3,8,])
 True

set
将删除重复项,如果列表中没有重复项,则sorted(l)=sorted(set(l))将返回
True
否则
False

需要考虑的是:@Martijn的答案比您的方法快得多。list
count()
方法必须在每次调用列表时检查列表中的每个元素,以计算元素数-这意味着对于一个6元素列表,您要检查整个列表6次,这应该会引起一些危险信号。@freeforalltousez:yes;对于
n
元素的列表,在每个
.count()
扫描
n
元素时,最多进行
n**2
测试。更简单的版本是检查集合的长度:
返回len(l)-len(set(l))
。这当然要快得多。