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倍
您在使用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次(或者是否已添加到desecond
列表中)。
此解决方案的时间复杂度为O(N),这意味着速度要快得多。此解决方案的重点在于解决问题。我给你一个提示:让你慢下来的事情是检查第二个列表中是否有
。。。事实上,这让你的第一次设置毫无意义。谢谢你的回复!我绝对没有考虑使用字典。