如何在不使用python中的set的情况下在列表中查找重复项?
我知道我们可以使用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)中运行。如果使用的列表有很多元素,这
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)