Python:比较更多的数字
我想在现有列表中搜索数字。若其中一个数字重复,那个么将变量的值设置为true,并中断循环Python:比较更多的数字,python,for-loop,numbers,compare,Python,For Loop,Numbers,Compare,我想在现有列表中搜索数字。若其中一个数字重复,那个么将变量的值设置为true,并中断循环 list = [3, 5, 3] //numbers in list 因此,如果函数得到两个相同的数字,则中断-在这种情况下,有3个重复 如何操作?您可以使用collections.Counter()和any(): 或者使用设置并匹配长度: In [5]: lis=[3,3,5] In [6]: not (len(lis)==len(set(lis))) Out[6]: True In [7]: li
list = [3, 5, 3] //numbers in list
因此,如果函数得到两个相同的数字,则中断-在这种情况下,有3个重复
如何操作?您可以使用
collections.Counter()
和any()
:
或者使用设置并匹配长度:
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
您可以使用collections.Counter()
和any()
:
或者使用设置并匹配长度:
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
。这是一个变量名,使用它作为变量名可能会产生不希望的副作用。让我们把它叫做L
您可以通过将列表与列表本身的版本进行比较来解决问题
编辑:当有重复时,您希望为true,而不是相反。代码已编辑
def testlist(L):
return sorted(set(L)) != sorted(L)
首先,不要给列表命名list
。这是一个变量名,使用它作为变量名可能会产生不希望的副作用。让我们把它叫做L
您可以通过将列表与列表本身的版本进行比较来解决问题
编辑:当有重复时,您希望为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 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
指出:
有一个习语,人们有时会用它把这种逻辑压缩成几行。我不一定推荐它,但值得知道:
你可以调查一下。您可以在列表中循环,或者将编号添加到支持集,或者中断循环
>>> l = [3, 5, 3]
>>> s = set()
>>> s
set([])
>>> for x in l:
... if x not in s:
... s.add(x)
... else:
... break
您还可以更进一步,使用此代码生成一个函数,返回找到的第一个重复编号(如果列表不包含重复编号,则返回None
):
否则,如果您想获得问题“此列表是否包含重复项?”的布尔答案,可以返回它而不是重复元素:
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
指出:
有一个习语,人们有时会用它把这种逻辑压缩成几行。我不一定推荐它,但值得知道:
永远不要给变量命名list
-list
是Python中的一种类型,你可以给自己设置各种各样的问题来屏蔽内置名称。给它一个描述性名称,如数字
也就是说。。。您可以使用集合来跟踪您已经看到的数字:
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)
永远不要给变量命名list
-list
是Python中的一种类型,你可以给自己设置各种各样的问题来屏蔽内置名称。给它一个描述性名称,如数字
也就是说。。。您可以使用集合来跟踪您已经看到的数字:
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)
无额外内存:
any(l.count(x) > 1 for x in l)
你返回的结果与OP的要求完全相反-如果有重复,则返回False,而不是True。如果OP愿意,可以通过附加not
来轻松更改。我在注释中解释了True
,False
对于这两种情况的含义。@Junuxx是正确的,我认为你应该解决这个问题。但是,如果你解决了这个问题,这是一个很好的解决方案,因为它通常比排序更快。如果OP要求重复,则返回与OP要求完全相反的结果-如果重复,则返回False,而不是True。如果OP愿意,可以通过添加not
来轻松更改,我解释了True
的含义,False
用于注释中的两种情况。@Junuxx是正确的,我认为您应该解决这个问题。但是,如果你解决了这个问题,这是一个很好的解决方案,因为它通常比排序更快。但是慢--O(n**2)而不是O(n)。但是慢--O(n**2)而不是O(n)。正如你可能知道的,人们有时会用一个习惯用法将这个逻辑压缩成几行。我不一定推荐它,但它值得了解:s=set();has_dupe=any(s中的x或s.add(x)表示lst中的x)
@senderle我不知道。我个人更喜欢稀疏(vs密集)版本,但知道它很好。我将把它添加到答案中;谢谢你的分享。正如你可能知道的,人们有时会用一个习惯用语将这种逻辑压缩成几行。我不一定推荐它,但它值得了解:s=set();has_dupe=any(s中的x或s.add(x)表示lst中的x)
@senderle我不知道。我个人更喜欢稀疏(vs密集)版本,但知道它很好。我将把它添加到答案中;谢谢分享。