Python按顺序返回重复列表

Python按顺序返回重复列表,python,list,duplicates,set,repeat,Python,List,Duplicates,Set,Repeat,如何按照列表的显示顺序快速返回重复列表?例如,重复([2,3,5,5,5,5,6,6,3])会导致[5,6,3],这意味着重复的元素只有在其第二个元素出现时才会添加到结果的重复列表中。到目前为止,我有下面的代码,但运行速度不够快,无法通过大型测试用例。没有导入,有没有更快的选择 def duplicates(L): first = set() second = [] for i in L: if i in first and i not in second

如何按照列表的显示顺序快速返回重复列表?例如,
重复([2,3,5,5,5,5,6,6,3])会导致[5,6,3]
,这意味着重复的元素只有在其第二个元素出现时才会添加到结果的重复列表中。到目前为止,我有下面的代码,但运行速度不够快,无法通过大型测试用例。没有导入,有没有更快的选择

def duplicates(L):
    first = set()
    second = []
    for i in L:
        if i in first and i not in second:
            second.append(i)
            continue
        if i not in first and i not in second:
            first.add(i)
            continue
    return second

修订已张贴代码

  • 在操作代码中使用字典而不是“second”的列表
  • 列表dict的查找时间是O(1)而不是O(n)
  • DICT跟踪Python 3.6+的插入顺序,也可以使用OrderedDict
代码

def duplicatesnew(L):
    first = set()
    second = {}   # Change to dictionary
    for i in L:
        if i in first and i not in second:
            second[i] = None
            continue
        if i not in first and i not in second:
            first.add(i)
            continue

    return list(second.keys())  # report list of keys

    lst = [2,3,5,5,5,6,6,3]
性能

def duplicatesnew(L):
    first = set()
    second = {}   # Change to dictionary
    for i in L:
        if i in first and i not in second:
            second[i] = None
            continue
        if i not in first and i not in second:
            first.add(i)
            continue

    return list(second.keys())  # report list of keys

    lst = [2,3,5,5,5,6,6,3]
总结

  • 在短名单上具有可比性
  • 在较长的列表中速度提高2倍
测试

使用长度为N的列表

对于N=6:使用原始列表

N>6使用:

  • N=6

    原件:2.24美元 修订:2.74美元

  • 1000个介于1和10之间的随机数

    原件:241美元 修订:146美元

  • N=100000

    原件:27.2毫秒 修订:13.4毫秒


  • 您在使用set
    first
    方面做得很好,因为它对
    in
    操作的时间复杂度为O(1)。 但在另一方面,您使用的是一个
    列表,它将此函数转换为O(N^2),在最坏的情况下,您将通过
    列表两次

    所以,我给你的建议是用字典存储你找到的数字

    例如:

    def duplicates(L):
        first = dict()
        second=[]
        for i in L:
            if i not in first:      #First time the number appears
                first[i] = False
            elif not first[i]:      #Number not on the second list
                second.append(i)
                first[i]=True
    
    return second
    
    请注意,我使用了一个布尔值作为字典键值来表示该数字是否出现超过1次(或者是否已添加到de
    second
    列表中)。
    此解决方案的时间复杂度为O(N),这意味着速度要快得多。

    此解决方案的重点在于解决问题。我给你一个提示:让你慢下来的事情是检查第二个列表中是否有
    。。。事实上,这让你的
    第一次设置毫无意义。谢谢你的回复!我绝对没有考虑使用字典。