在随机整数列表中(在列表中重复整数),从列表中完全不重复打印该整数的方法是什么?
我试图通过编写以下程序来解决这个问题:
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个)元素的列表进行测试时,该程序会超时。
请帮助我优化上面的代码。
答案 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
个动作。