1

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

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

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

怎么做?

4

5 回答 5

4

首先,不要命名您的列表list。那是Python 内置的,使用它作为变量名会产生不希望的副作用。L让我们改为调用它。

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

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

def testlist(L):
    return sorted(set(L)) != sorted(L)
于 2012-10-28T11:54:33.977 回答
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
于 2012-10-28T11:54:13.430 回答
2

你可以看看set。你遍历你的列表,或者将数字添加到支持集,或者打破循环。

>>> 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)
于 2012-10-28T11:56:41.600 回答
0

你永远不应该给list变量起名字——list它是 Python 中的一种类型,你会给自己带来各种各样的问题来掩盖这样的内置名称。给它一个描述性的名字,比如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)
于 2012-10-28T11:59:48.813 回答
0

没有额外的内存:

any(l.count(x) > 1 for x in l)
于 2012-10-28T12:07:43.360 回答