如何在不使用python中的set的情况下在列表中查找副本?

时间:2014-02-21 04:47:18

标签: python

我知道我们可以在python中使用set来查找列表中是否有任何重复。我只是想知道,如果我们可以在不使用set的情况下在列表中找到副本。

说,我的清单是

a=['1545','1254','1545']
那么如何找到副本?

7 个答案:

答案 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)