Python 高效地查找列表中的重复项

Python 高效地查找列表中的重复项,python,algorithm,performance,list,time-complexity,Python,Algorithm,Performance,List,Time Complexity,我有一个函数,它在数组中搜索重复条目,然后返回重复条目的列表。我想加快这段代码的速度,有人能推荐一种更有效的方法吗 代码: 这里的想法是在线性时间内进行一次扫描。您可以使用计数器来执行此操作。其思想是对每个元素进行计数,然后返回所有经过多次计数的元素 from collections import Counter def get_duplicates(array): c = Counter(array) return [k for k in c if c[k] > 1]

我有一个函数,它在数组中搜索重复条目,然后返回重复条目的列表。我想加快这段代码的速度,有人能推荐一种更有效的方法吗

代码:


这里的想法是在线性时间内进行一次扫描。您可以使用计数器来执行此操作。其思想是对每个元素进行计数,然后返回所有经过多次计数的元素

from collections import Counter

def get_duplicates(array):
    c = Counter(array)
    return [k for k in c if c[k] > 1] 

上述方法在复杂度上是线性的,但对输入进行两次传递-一次进行计数(这由
计数器
构造函数抽象出来),另一次返回列表comp中的非唯一值。您可以使用
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
检查,并以
集合的形式提供额外的空间,但您将两次传递减少为一次

列表中的元素类型是什么

  • 如上所述,将元素存储在一个集合中会使您获得平均复杂度Θ(n),但要求元素是可散列的(Python中的集合是用散列表实现的,请参阅)
  • 如果您有一个比较函数,您可以在最坏的情况下对列表进行排序(nlog(n)),然后将列表中的每个元素与下一个元素进行比较
  • 如果您有一个比较函数,那么您还可以使用(平衡的)BST实现一个集合,并按照与1相同的方法来实现平均复杂度(nlog(n))(在最坏的情况下)

  • @COLDSPEED谢谢你这么快回复我!因此,如果我理解正确,您最后建议的运行时间将是输入数组的线性函数。对吗?这与我提供的原始函数的运行时有何不同?@user3476463循环中有一个循环。这意味着你的函数是二次函数,比线性函数慢得多。@COLDSPEED嗨,我试着用testArray=['a','b','c','d','e','d']打印你的建议的结果,使用print get_duplicates(testArray),我得到以下消息,如果我想打印结果,我需要做什么?我不太熟悉生成器。@user3476463是的,
    yield
    返回生成器。使用以下命令转换为列表:
    x=list(获取重复项(…)
    @COLDSPEED谢谢,比以前的版本快得多!
    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