Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:比较更多的数字_Python_For Loop_Numbers_Compare - Fatal编程技术网

Python:比较更多的数字

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

我想在现有列表中搜索数字。若其中一个数字重复,那个么将变量的值设置为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]: 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密集)版本,但知道它很好。我将把它添加到答案中;谢谢分享。