我想在现有列表中搜索数字。如果是重复的此数字之一,则将变量的值设置为true并破坏循环。
list = [3, 5, 3] //numbers in list
因此,如果该函数获得两个相同的数字,则突破 - 在这种情况下,有3个重复。
如何做?
首先,不要命名您的列表list
。那就是 python内置,将其用作变量名称可能会产生不希望的副作用。我们称其为 L
。
您可以通过将列表与 set 版本进行比较来解决问题。
编辑:当那里是重复,而不是相反时,您想要true。编辑。
def testlist(L):
return sorted(set(L)) != sorted(L)
您可以查看集合。您循环浏览列表,然后将数字添加到支持集中,或者打破循环。
>>> 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)
您可以使用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
您永远不要将名称 list
命名为变量- list
是python中的a type ,您可以给自己各种问题像那样。给它一个描述性名称,例如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)