Python3:不重复整数

时间:2018-10-28 15:34:51

标签: python python-3.x

在随机整数列表中(在列表中重复整数),从列表中完全不重复打印该整数的方法是什么?

我试图通过编写以下程序来解决这个问题:

K = int(input())

room_list = list(input().split())

room_set = set(room_list)

for i in room_set:

    count = room_list.count(i)

    if count == 1:
        i = int(i)
        print(i)
        break

K是列表中元素的数量。

当我尝试运行上述程序时,它在元素较少的情况下运行良好,但是,当使用包含(例如825个)元素的列表进行测试时,该程序会超时。

请帮助我优化上面的代码。

2 个答案:

答案 0 :(得分:4)

列表中重复计数为1的元素就是您的答案。

from collections import Counter
a = [1,1,1,2,2,3,4,5,5]
c = Counter(a) # O(n)
x = [key for key, val in c.items() if val == 1]
print(x)

输出:

[3,4]

Counter class通过遍历列表一次来创建元素和重复字典,这需要花费时间O(n),而每个元素的访问都需要O(1)时间。

列表的计数功能每次在列表上调用时都会迭代。您的情况需要O(n ^ 2)时间。

答案 1 :(得分:2)

这将显示最不常出现的号码:

data = [3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,93,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9]

from collections import Counter

# least often
print (Counter(data).most_common()[-1][0])

# all non-repeated onces
# non_repeat = [k[0] for k in Counter(data).most_common() if k[1] == 1] 

输出:

93

它使用专门的字典:collection.Counter的构建目的是为了对您提供的可迭代次数进行计数。

方法.most_common()返回一个(key,count)元组的排序列表-通过打印它的最后一个成员,您得到的那个成员最少。

内置字典如下:

Counter({4: 4, 5: 4, 6: 4, 7: 4, 8: 4, 3: 3, 9: 3, 0: 2, 1: 2, 2: 2, 93: 1})

一种类似的方法是使用collections.defaultdict自己进行计数,然后以最小的值得到一个:

from collections import defaultdict

k = defaultdict(int)
for elem in data:
    k[elem] += 1

print( min(k.items(), key=lambda x:x[1]) ) 

最后的解决方案在方法上类似,但没有专门的计数器-它们两者的优点是您可以遍历整个列表一次并增加一个值,而不是遍历整个列表 n 次并计算每个不同元素的出现一次。

  • 在纯净的不同元素列表上使用count()会导致n的计数运行通过n元素=需要执行n^2个动作。
  • 字典方法只需要通过列表一次,因此仅需要n个动作。