我编写了一个脚本来删除列表中的所有唯一元素,并仅使用重复的元素打印列表:
下面是输入列表的输出列表应该是
的一些示例Input list1:
1,2,1,1,3,5,3,4,3,1,6,7,8,5
Output List1:
1,1,1,3,5,3,3,1,5
Input list2:
1,2,1,1,3,3,4,3,1,6,5
Output List2:
1,1,1,3,3,3,1
#! /bin/python
def remove_unique(*n):
dict1={}
list1=[]
for i in range(len(n)):
for j in range(i+1,len(n)):
if n[i] == n[j]:
dict1[j]=n[j]
dict1[i]=n[i]
for x in range(len(n)):
if x in dict1.keys():
list1.append(dict1[x])
return list1
lst1=remove_unique(1,2,1,1,3,5,3,4,3,1,6,7,8,5)
for n in lst1:
print(n, end=" ")
使用少量较小的列表进行测试时,上面的脚本完全符合预期。但是,我想要了解如何针对具有更大长度的输入列表优化脚本(考虑时间和空间复杂性)的一些想法(50000 <= len(list)&lt; = 50M)
答案 0 :(得分:3)
您的脚本存在许多问题:
if x in dict1.keys()
=&gt; if x in dict1
确保使用字典检查而不是线性append
在一个循环中,而不是高效。O(n^2)
复杂因为双循环我的方法:
您可以使用collections.Counter
统计您的元素,然后使用列表推导过滤掉一个新列表,使用过滤次数:
from collections import Counter
list1 = [1,2,1,1,3,5,3,4,3,1,6,7,8,5]
c = Counter(list1)
new_list1 = [k for k in list1 if c[k]>1]
print(new_list1)
结果:
[1, 1, 1, 3, 5, 3, 3, 1, 5]
我可能错了,但是,这种方法的复杂性是(大致)O(n*log(n))
(列表的线性扫描加上字典中键的散列和列表理解中的查找)。所以,它在性能方面表现良好。