我有下面的函数,它在数组中搜索重复的条目,然后返回重复的列表。我想加快我的代码速度,有人能提出更有效的方法吗?
代码:
def findDupe(array):
dupelist = []
for i in range(len(array)):
for j in range(len(array)):
comp1 = array[i]
comp2 = array[j]
if comp1 == comp2 and i!=j:
if comp2 not in dupelist:
dupelist.append(comp2)
return dupelist
答案 0 :(得分:2)
这里的想法是在线性时间内进行单次扫描。您可以使用计数器执行此操作。我们的想法是计算每个元素,然后返回所有被计数多次的元素。
from collections import Counter
def get_duplicates(array):
c = Counter(array)
return [k for k in c if c[k] > 1]
上面的方法在复杂度上是线性的,但是在输入上进行两次传递 - 一次,计数(这被Counter
构造函数抽象掉),另一种是在列表中返回非唯一值可比。您可以使用yield
语句对此进行优化,并在找到它们时返回重复项。
def get_duplicates(array):
c = Counter()
seen = set()
for i in array:
c[i] += 1
if c[i] > 1 and i not in seen:
seen.add(i)
yield i
这导致强制if
检查和set
形式的额外空间,但您将两个传递减少到一个。
答案 1 :(得分:0)
列表中的元素类型是什么?