如何实现函数找出原列表中三个最低唯一值里出现次数最多的元素?
解决方法:在三个最低唯一值中找出出现次数最多的元素
你的问题出在most_common_lowest函数的逻辑上——当前代码在循环的第一次迭代就直接返回了整个原列表中出现次数最多的元素,完全没有限制在lowest_three返回的三个目标值范围内,这就是为什么会得到不在结果里的5.00099。
正确的实现方式
我们需要先拿到三个最低的唯一值,然后只在这三个值中统计它们在原列表的出现次数,找出次数最多的那个:
from heapq import nsmallest def lowest_three(somelist): lowest_unique = set(somelist) return nsmallest(3, lowest_unique) def most_common_lowest(somelist): # 先获取三个最低的唯一值 target_values = lowest_three(somelist) # 在目标值范围内,找出原列表中出现次数最多的元素 return max(target_values, key=lambda x: somelist.count(x))
测试你的示例列表,这个函数会返回预期的5.0000075,因为它在原列表中出现了3次,是三个最低值里出现次数最多的。
优化方案(针对大列表)
如果你的列表很大,多次调用somelist.count()会重复遍历列表,效率较低。可以用collections.Counter先一次性统计所有元素的出现次数,再进行判断:
from heapq import nsmallest from collections import Counter def lowest_three(somelist): lowest_unique = set(somelist) return nsmallest(3, lowest_unique) def most_common_lowest(somelist): target_values = lowest_three(somelist) # 一次性统计所有元素的出现次数 count_map = Counter(somelist) # 根据预统计的次数找出目标值里的最大值 return max(target_values, key=lambda x: count_map[x])
这个版本只需要遍历原列表一次统计次数,后续的查找操作都是O(1)的,性能会好很多。
内容的提问来源于stack exchange,提问作者treetop
相关产品推荐
相关产品推荐

