我想在现有列表中搜索数字。如果重复此数字之一,则将变量的值设置为 true 并中断循环。
list = [3, 5, 3] //numbers in list
因此,如果函数得到两个相同的数字,则中断 - 在这种情况下,有 3 个重复。
怎么做?
首先,不要命名您的列表list
。那是Python 内置的,使用它作为变量名会产生不希望的副作用。L
让我们改为调用它。
您可以通过将列表与自身的集合版本进行比较来解决您的问题。
编辑:当有重复时,你想要 true ,而不是相反。代码已编辑。
def testlist(L):
return sorted(set(L)) != sorted(L)
你可以使用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
你可以看看set。你遍历你的列表,或者将数字添加到支持集,或者打破循环。
>>> 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)
你永远不应该给list
变量起名字——list
它是 Python 中的一种类型,你会给自己带来各种各样的问题来掩盖这样的内置名称。给它一个描述性的名字,比如numbers
.
也就是说......您可以使用一组来跟踪您已经看到的数字:
def first_double(seq):
"""Return the first item in seq that appears twice."""
found = set()
for item in seq:
if item in found:
return item
# return will terminate the function, so no need for 'break'.
else:
found.add(item)
numbers = [3, 5, 3]
number = first_double(numbers)
没有额外的内存:
any(l.count(x) > 1 for x in l)