如何使用列表False
中的True
循环等来返回for
或l
的代码?
我是否应该使用计数器来计算重复数?我以为我可以使用点计数表示法来计算它们的重复数量。如果计数超过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
答案 0 :(得分:4)
看到一组值,并在看到重复后立即返回False
:
def all_different(l):
seen = set()
for i in l:
if i in seen:
return False
seen.add(i)
return True
简化就是一次创建set()
并测试长度;较短的一组意味着有重复。这做了更多工作;对于大型列表,上述方法更有效,因为它短路;一找到副本就立即返回False
。
请注意,您的计数方法每次都会扫描列表 ,您创建了一个二次算法;将元素添加到列表时,工作量会相乘。
答案 1 :(得分:3)
试试这个,这是一个更简单的方法,不需要显式循环 - 它使用的事实是,根据定义,一个集合不允许重复。如果列表和集合具有相同数量的元素,那是因为没有重复项开头:
def allDifferent1D(lst):
return len(lst) == len(set(lst))
如果False
列表中有重复项,则上述函数将返回lst
;如果所有元素都是唯一的,则上述函数将返回True
,并且不需要对输入列表进行排序。例如:
allDifferent1D([1, 2, 2, 3, 4, 4])
=> False
allDifferent1D([1, 2, 3, 4, 5, 6])
=> True
答案 2 :(得分:0)
这种方法将产生具有O(nlogn)复杂性和O(1)空间的解决方案。
当您对列表进行排序时,重复的值应该是邻居,而不使用集合来存储我们已经看过的项目,我们可以使用O(1)-space算法。
当我们对元素进行排序时(假设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)
答案 3 :(得分:0)
这里简单的一个:
>>> 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
将删除重复,如果列表没有重复,则排序(l)==已排序(set(l))将返回True
else False