选择具有最低值的模式

时间:2017-12-30 06:48:16

标签: python string mode

列表[1,1,2,2,4,5]

的示例

模式为1和2.

如果我在python中的statistics包中使用mode函数,我会收到错误消息,说明没有唯一模式。

但我希望打印较低模式,即“1”。

感谢您的回答。

5 个答案:

答案 0 :(得分:1)

希望这会有所帮助。 修改:使modes成为生成器而不是列表。感谢@codykochmann的评论

from collections import Counter
nums = [7, 2, 2, 1, 1, 4, 5, 6]

c = Counter(nums) # count numbers
max_number_count = c.most_common(1)[0][1]
modes = (item for item, count in c.items() if count == max_number_count) 
min_mode = min(modes)

添加更多号码: 更新以前的计数器很容易。假设新号码为nums_2,您可以使用c.update(nums_2)更新计数器c,然后找到新的最低模式。感谢@Gautham Velchuru的回答。

答案 1 :(得分:1)

Scipy's mode正是如此:

j

然后from scipy.stats import mode m, c = mode([1, 1, 2, 2, 4, 5]) 是最低模式(1),m是其频率(2)。

答案 2 :(得分:0)

您可以随时自行滚动 - 如果列表已排序,您可以保持运行模式,只有在出现更多事件的新值时才更新它。

答案 3 :(得分:0)

简单但效率低下;

nums = [0,1,1]
nums = sorted([(x, -nums.count(x)) for x in set(nums)], key=lambda tup: tup[0])
nums.sort(key=lambda tup: tup[1])
print(nums[0][0])

使用val存储元组列表并对其进行排序和排序。由于排序最小到最大,因此可以将计数乘以-1。

答案 4 :(得分:0)

我认为这是一个排序的谜题,但后来意识到我们只关心获得最小的模式,所以跳过任何索引或元组排序,以保持记忆和速度快乐。

from collections import Counter
nums = [7, 2, 2, 1, 1, 4, 5, 6]

c = Counter(nums)
max_count = max(c.values())
print(min(k for k,v in c.items() if v==max_count))