我知道我们可以在python中使用set来查找列表中是否有任何重复。我只是想知道,如果我们可以在不使用set的情况下在列表中找到副本。
说,我的清单是
a=['1545','1254','1545']
那么如何找到副本?
答案 0 :(得分:2)
a=['1545','1254','1545']
from collections import Counter
print [item for item, count in Counter(a).items() if count != 1]
<强>输出强>
['1545']
该解决方案以O(N)运行。如果使用的列表包含很多元素,这将是一个巨大的优势。
如果您只是想查找列表是否有重复项,您只需执行
即可a=['1545','1254','1545']
from collections import Counter
print any(count != 1 for count in Counter(a).values())
作为@gnibbler suggested,这将是实际上最快的解决方案
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)
答案 1 :(得分:1)
使用list.count
:
In [309]: a=['1545','1254','1545']
...: a.count('1545')>1
Out[309]: True
答案 2 :(得分:1)
使用list.count
:
>>> a = ['1545','1254','1545']
>>> any(a.count(x) > 1 for x in a) # To check whether there's any duplicate
True
>>> # To retrieve any single element that is duplicated
>>> next((x for x in a if a.count(x) > 1), None)
'1545'
# To get duplicate elements (used set literal!)
>>> {x for x in a if a.count(x) > 1}
set(['1545'])
答案 3 :(得分:1)
对列表进行排序,并检查下一个值是否与最后一个值不等。
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 log n),对于big n来说,它比Counter解决方案慢(但是计数器在引擎盖下使用了一个dict ......实际上并没有太大的不同)。
另一种方法是插入元素并保持列表排序..请参阅bisect模块。它会使您的插入速度变慢,但您需要快速检查重复项。
答案 4 :(得分:1)
>>> 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'])
答案 5 :(得分:1)
如果这是家庭作业,你的老师可能会要求这种效率极低的.count()
式答案。
在实践中,如果不允许dict
,则使用set
是您的下一个最佳选择。
>>> 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'
答案 6 :(得分:0)
感谢所有人解决这个问题。我也从不同的答案中学到了很多东西。这就是我的回答:
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)