我想在现有列表中搜索数字。如果其中一个数字重复,则将变量的值设置为true并断开循环。
list = [3, 5, 3] //numbers in list
因此,如果函数获得两个相同的数字,那么中断 - 在这种情况下有3个重复。
怎么做?
答案 0 :(得分:4)
首先,不要为列表list
命名。这是Python built-in,将其用作变量名可能会产生不良副作用。我们改为称之为L
。
您可以通过将列表与自身的set版本进行比较来解决您的问题。
编辑:当 重复时,你想要真实,而不是相反。代码已编辑。
def testlist(L):
return sorted(set(L)) != sorted(L)
答案 1 :(得分:2)
您可以使用collections.Counter()
和any()
:
>>> lis=[3,5,3]
>>> c=Counter(lis)
>>> any(x>1 for x in c.values()) # True means yes some value is repeated
True
>>> lis=range(10)
>>> c=Counter(lis)
>>> any(x>1 for x in c.values()) # False means all values only appeared once
False
或使用sets
并匹配长度:
In [5]: lis=[3,3,5]
In [6]: not (len(lis)==len(set(lis)))
Out[6]: True
In [7]: lis=range(10)
In [8]: not (len(lis)==len(set(lis)))
Out[8]: False
答案 2 :(得分:2)
您可以查看sets。您遍历列表,并将数字添加到支持集,或者中断循环。
>>> l = [3, 5, 3]
>>> s = set()
>>> s
set([])
>>> for x in l:
... if x not in s:
... s.add(x)
... else:
... break
您还可以更进一步,使用此代码创建一个函数,返回您找到的第一个重复的数字(如果列表不包含重复项,则返回None
):
def get_first_duplicate(l):
s = set()
for x in l:
if x not in s:
s.add(x)
else:
return x
get_first_duplicate([3, 5, 3])
# returns 3
否则,如果你想得到一个问题的布尔答案“这个列表是否包含重复项?”,你可以返回它而不是重复元素:
def has_duplicates(l):
s = set()
for x in l:
if x not in s:
s.add(x)
else:
return true
return false
get_first_duplicate([3, 5, 3])
# returns True
senderle 指出:
人们有时会用这种习惯将这种逻辑压缩成几行。我不一定推荐它,但值得了解:
s = set(); has_dupe = any(x in s or s.add(x) for x in l)
答案 3 :(得分:0)
没有额外的记忆:
any(l.count(x) > 1 for x in l)