繁体   English   中英

Python脚本从列表中删除唯一元素,并按正确顺序使用重复元素打印列表

[英]Python script to remove unique elements from a list and print the list with repeated elements in proper order

我编写了一个脚本来删除列表中的所有唯一元素,并仅使用重复的元素打印列表:

下面是输入列表的输出列表应该如何的一些示例

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(列表)<= 50M)

你的脚本有很多问题:

  • if x in dict1.keys() =>中的经典if x in dict1.keys() 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)) (列表的线性扫描加上字典中的键的散列和列表理解中的查找)。 所以,它在性能方面表现良好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM