Python:比较更多数字



我想在现有列表中搜索数字。如果是重复的此数字之一,则将变量的值设置为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)

相关内容

  • 没有找到相关文章

最新更新