Python:比较更多数字

时间:2012-10-28 11:50:24

标签: python for-loop numbers compare

我想在现有列表中搜索数字。如果其中一个数字重复,则将变量的值设置为true并断开循环。

list = [3, 5, 3] //numbers in list

因此,如果函数获得两个相同的数字,那么中断 - 在这种情况下有3个重复。

怎么做?

4 个答案:

答案 0 :(得分:4)

首先,不要为列表list命名。这是Python built-in,将其用作变量名可能会产生不良副作用。我们改为称之为L

您可以通过将列表与自身的set版本进行比较来解决您的问题。

编辑:当 重复时,你想要真实,而不是相反。代码已编辑。

def testlist(L):
    return sorted(set(L)) != sorted(L)

答案 1 :(得分:2)

您可以使用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

答案 2 :(得分:2)

您可以查看sets。您遍历列表,并将数字添加到支持集,或者中断循环。

>>> 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)

答案 3 :(得分:0)

没有额外的记忆:

any(l.count(x) > 1 for x in l)