Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.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中的set的情况下在列表中查找重复项?_Python - Fatal编程技术网

如何在不使用python中的set的情况下在列表中查找重复项?

如何在不使用python中的set的情况下在列表中查找重复项?,python,Python,我知道我们可以使用python中的集合来查找列表中是否有重复项。我只是想知道,如果不使用set,我们是否可以在列表中找到重复项 喂,我的名单是 a=['1545','1254','1545'] 那么如何找到重复项呢?使用list.count: In [309]: a=['1545','1254','1545'] ...: a.count('1545')>1 Out[309]: True 使用: 输出 ['1545'] 此解决方案在O(N)中运行。如果使用的列表有很多元素,这

我知道我们可以使用python中的集合来查找列表中是否有重复项。我只是想知道,如果不使用set,我们是否可以在列表中找到重复项

喂,我的名单是

a=['1545','1254','1545']

那么如何找到重复项呢?

使用
list.count

In [309]: a=['1545','1254','1545']
     ...: a.count('1545')>1
Out[309]: True
使用:

输出

['1545']
此解决方案在O(N)中运行。如果使用的列表有很多元素,这将是一个巨大的优势

如果您只想查找列表中是否有重复项,只需执行以下操作即可

a=['1545','1254','1545']
from collections import Counter
print any(count != 1 for count in Counter(a).values())
因此,这将是实际上最快的解决方案

from collections import defaultdict
def has_dup(a):
    result = defaultdict(int)
    for item in a:
        result[item] += 1
        if result[item] > 1:
            return True
    else:
        return False

a=['1545','1254','1545']
print has_dup(a)

对列表进行排序,并检查下一个值是否不等于最后一个值

a.sort()
last_x = None
for x in a:
    if x == last_x:
       print "duplicate: %s" % x
       break # existence of duplicates is enough

    last_x = x
这应该是O(n logn),对于大n来说,这比计数器的解决方案慢(但是计数器在引擎盖下使用dict。,这与集合并没有太大的不同)


另一种方法是插入元素并保持列表排序。。请参阅对分模块。这会使插入变慢,但检查重复项的速度很快。

如果这是家庭作业,你的老师可能会要求回答效率极低的
.count()
式答案

>>> lis = []
>>> a=['1545','1254','1545']
>>> for i in a:
...     if i not in lis:
...         lis.append(i)
... 
>>> lis
['1545', '1254']
>>> set(a)
set(['1254', '1545'])
在实践中,如果
set
被禁止,那么使用
dict
是下一个最佳选择

>>> a = ['1545','1254','1545']
>>> D = {}
>>> for i in a:
...     if i in D:
...         print "duplicate", i
...         break
...     D[i] = i
... else:
...     print "no duplicate"
... 
duplicate 1545
下面是一个使用groupby的版本,它比
.count()
方法要好得多

>>> from itertools import groupby
>>> a = ['1545','1254','1545']
>>> next(k for k, g in groupby(sorted(a)) if sum(1 for i in g) > 1)
'1545'

谢谢大家解决这个问题。我也从不同的答案中学到了很多。我是这样回答的:

a=['1545','1254','1545']
d=[]
duplicates=False
for i in a:
    if i not in d:
        d.append(i)
        if len(d)<len(a):
            duplicates=True
        else:
            duplicates=False
print(duplicates)
a=['1545'、'1254'、'1545']
d=[]
重复=错误
对于我来说,在一个:
如果我不在d:
d、 附加(i)

如果len(d)你想知道是否存在重复项,或者得到重复项列表或者我们能找到的第一个重复项吗?重复项的存在就足够了。你不能使用集合的原因是什么?我想从迭代的角度来探讨这个问题。他不想使用
集合
:)我得到的是,我的答案与是的,谢谢你的主意。它很简洁。这个模式可以通过
itertools.groupby
来简化。这可能是最好的答案的唯一原因是不使用set的唯一原因是内存使用。这就解决了这个问题。@davidermann,没有itertools.groupby,只对连续的项目进行分组。一点也不像一套。SQL和Ruby的groupbys完全是另一回事。首先为您提供更多常用元素。该方法还接受可选的
n
(编号)
any(count!=1表示计数器(a)中的计数)。values())
可以替换为
any(count!=1表示计数器(a)。最常见的(1)是
计数器(a)。最常见的(1)[0][1]>1
(假设
a
不是空的)计数器的问题是它不能短路。因为仅仅存在就足够了,所以当第一次计数达到2时应该停止。启用defaultdict answer.@falsetru但要获得最常见的
,它应该在内部排序,对吗?这使它成为O(NlogN):(啊,你说得对。我原以为
计数器
可以在内部使用堆队列,但它没有。@gnibler包括
defaultdict
版本:)
>>> from itertools import groupby
>>> a = ['1545','1254','1545']
>>> next(k for k, g in groupby(sorted(a)) if sum(1 for i in g) > 1)
'1545'
a=['1545','1254','1545']
d=[]
duplicates=False
for i in a:
    if i not in d:
        d.append(i)
        if len(d)<len(a):
            duplicates=True
        else:
            duplicates=False
print(duplicates)