Python 索引和切片。检查是否有任何项目出现两次

Python 索引和切片。检查是否有任何项目出现两次,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,假设你有一张清单 List1(1,2,2,3,4) 您将使用什么代码检查一个数字是否出现两次如果您只想测试是否有任何元素重复,但不关心它们是哪一个,您只需执行以下操作: len(list) == len(set(list)) 但这可能是也可能不是最有效的实现。如果您只想测试是否有任何元素重复,但不关心它们是哪些元素,您可以简单地执行以下操作: len(list) == len(set(list)) 但这可能是也可能不是最有效的实现。您可以使用对象获取所有重复元素的列表: >>&

假设你有一张清单

List1(1,2,2,3,4)

您将使用什么代码检查一个数字是否出现两次如果您只想测试是否有任何元素重复,但不关心它们是哪一个,您只需执行以下操作:

len(list) == len(set(list))

但这可能是也可能不是最有效的实现。

如果您只想测试是否有任何元素重复,但不关心它们是哪些元素,您可以简单地执行以下操作:

len(list) == len(set(list))
但这可能是也可能不是最有效的实现。

您可以使用对象获取所有重复元素的列表:

>>> from collections import Counter
>>> 
>>> l = [1,2,2,3,4]
>>> 
>>> [k for k,v in Counter(l).iteritems() if v > 1] 
[2]
如果您只想检查是否存在重复项,但不关心该重复项实际上是什么,请将列表的长度与列表中包含的元素集的长度进行比较:

>>> len(l) != len(set(l))
True
如果存在重复项,则集合的长度将小于列表的长度。如果没有,两个长度将相等。

您可以使用对象来获取所有重复元素的列表:

>>> from collections import Counter
>>> 
>>> l = [1,2,2,3,4]
>>> 
>>> [k for k,v in Counter(l).iteritems() if v > 1] 
[2]
如果您只想检查是否存在重复项,但不关心该重复项实际上是什么,请将列表的长度与列表中包含的元素集的长度进行比较:

>>> len(l) != len(set(l))
True

如果存在重复项,则集合的长度将小于列表的长度。如果没有,两个长度将相等。

计数器(列表1)和
设置(列表1)
的问题是它们不能缩短电路。因此,如果列表1有一百万个项目,那么在得到答案之前,您需要处理整个列表

假设我们有

List1 = [1, 2, 2, 3, 4]

def has_duplicate(List1)
    s = set()
    for item in List1:
        if item in s:
            return True
        s.add(item)
    return False
现在,只需查看3项即可返回函数

如果
List1
仅包含可散列项,则可以这样做。如果有不可散列的项,您可以将它们提取到单独的列表中,只需@Christian的答案中的
.count()
方法即可


如果有人真的需要这么快,同样的逻辑可以用来制作一个版本的
set
构造函数并编译成本机函数。

计数器(列表1)和
set(列表1)
的问题是它们不能短接电路。因此,如果列表1有一百万个项目,那么在得到答案之前,您需要处理整个列表

假设我们有

List1 = [1, 2, 2, 3, 4]

def has_duplicate(List1)
    s = set()
    for item in List1:
        if item in s:
            return True
        s.add(item)
    return False
现在,只需查看3项即可返回函数

如果
List1
仅包含可散列项,则可以这样做。如果有不可散列的项,您可以将它们提取到单独的列表中,只需@Christian的答案中的
.count()
方法即可



如果有人真的需要快速执行此操作,则可以使用相同的逻辑来生成
集合
构造函数的一个版本,并将其编译为本机函数。

取决于列表是否保证按照示例中的顺序进行排序?具体数字还是任意数字?确切地说是两次,最多两次?可能是三次,也可能是四次,或者其他。请提供更多详细信息。你在乎复制的号码吗?或者您只是想看看是否存在任何重复项。只需检查一个数字(任何)出现的次数是否超过一次,列表是否保证按您的示例进行排序?具体数字还是任意数字?确切地说是两次,最多两次?可能是三次,也可能是四次,或者其他。请提供更多详细信息。你在乎复制的号码吗?或者你只是想看看是否存在任何重复。只需检查一个数字(任何)是否多次出现。请留下评论。我想知道这个答案有什么问题。是的,是我。答案不会短路,您使用
l
作为变量名,并且没有提到此方法要求元素可散列。@wim我将逐一解决您的问题。1) 答案没有短路,这是正确的。OP没有告诉我们他计划使用的列表的大小,所以我认为效率不是主要因素。我坚持这一点,因为我不会为了提高效率而牺牲这一行的可读性和简单性,这可能是不必要的。当然,我的假设可能不正确,在这种情况下,OP可以自由使用不同的方法。(待续)关于
l
的问题不是您应该使用更具描述性的名称,而是在某些情况下它与
1
无法区分。如果你认为这是荒谬的,请注意《官方风格指南》建议这样使用
l
。@wim向上投票,以抵消你对一个体面答案的相当严厉和毫无意义的向下投票。你没有否决另一个没有提到元素必须是可散列的答案?否决:请留下评论。我想知道这个答案有什么问题。是的,是我。答案不会短路,您使用
l
作为变量名,并且没有提到此方法要求元素可散列。@wim我将逐一解决您的问题。1) 答案没有短路,这是正确的。OP没有告诉我们他计划使用的列表的大小,所以我认为效率不是主要因素。我坚持这一点,因为我不会为了提高效率而牺牲这一行的可读性和简单性,这可能是不必要的。当然,我的假设可能不正确,在这种情况下,OP可以自由使用不同的方法。(待续)关于
l
的问题不是您应该使用更具描述性的名称,而是在某些情况下它与
1
无法区分。如果你认为这是荒谬的,请注意《官方风格指南》建议这样使用
l
。@wim向上投票,以抵消你对一个体面答案的相当严厉和毫无意义的向下投票。您没有否决另一个没有提到元素必须是可散列的答案吗?需要注意的是,虽然这会造成短路,但它也是用python实现的。与其他两种方法相比,它在出现故障时需要更长的时间。取决于您的用例