c语言编程笔录

首页 >   > 笔记大全

笔记大全

Python 中的众数

更新时间:2023-11-22

什么是众数

众数指的是一组数据中出现最频繁的数值。例如,在{1,2,3,3,3,4,4,5,5}这组数据中,3就是众数。

nums = [1, 2, 3, 3, 3, 4, 4, 5, 5]
most_frequent = max(set(nums), key = nums.count)
print(most_frequent)  # 输出为 3

以上代码中,首先定义了一个列表 nums,然后将其传递给 set 函数以去除重复数字。接着使用内置函数 max 和方法 count,max函数的key属性以nums中的每个元素为输入并计算每个元素在列表中出现的次数,选取最大的那个元素作为返回值,就找到了众数。在这个示例中,3出现了最多次,因此输出结果为3。

如何处理多个众数的情况

有时,一个数据集可能会有多个众数。例如,{1,2,2,3,4,4}。在这种情况下,有多种方法来解决它。一种方法是返回一个包含所有众数的列表。

from collections import Counter
 
nums = [1, 2, 2, 3, 4, 4]
freq_dict = Counter(nums)
max_freq = max(list(freq_dict.values()))
modes = [num for num, freq in freq_dict.items() if freq == max_freq]
print(modes)  # 输出为 [2, 4]

以上代码中,collections模块的 Counter 类用于统计每个数字在列表中出现的次数。 max 函数找到字典中出现次数最多的数值。然后,使用 list comprehension 来找到所有频率最高的数字。

如何 处理没有众数的情况

有时候,数据集中没有众数。例如,{1, 2, 3, 4}即没有众数。在这种情况下,可以选择返回一个随意选择的数值或者不返回任何数值。

nums = [1, 2, 3, 4]
# 当有多个众数时返回其中任意一个众数,没有众数则返回任意一个数
import random
 
try:
    most_frequent = max(set(nums), key = nums.count)
except:
    most_frequent = random.choice(nums)
print(most_frequent)  # 输出为 1,2,3,4 中的一个

在这个示例中,使用 try except 语句来判断是否有众数,如果有则按照前面的方法找出众数。如果没有众数,就使用 Python 的内置 random 模块中的随机数函数来随机返回该列表中的一个数字。

如何在大数据集中找到众数

在大数据集中,使用上述方法寻找众数的效率可能会非常低。一个更好的方法是使用 Boyer-Moore Majority Vote 算法。该算法提供了 O(n) 时间复杂度的解决方案。

def find_majority_element(nums):
    candidate = None
    count = 0
    for num in nums:
        if count == 0:
            candidate = num
        count += (1 if num == candidate else -1)
     
    return candidate
 
# 使用find_majority_element找到众数
nums = [1, 2, 3, 2, 2]
print(find_majority_element(nums))  # 输出为 2

以上代码中,借助一个叫做“候选数”(candidate) 的变量,遍历整个列表,每次到达新的数字就将它与候选项(candidate) 比较,如果相同,将 count + 1,否则将 count -1。当 count 为 0 时,说明该候选数已经被抵消,所以将新的数字设为新的候选数。最终剩下的候选数就是众数。

众数是所有统计描述量中最为常见的指标之一,通过上面的介绍,可以看出Python语言中实现寻找众数的方法非常简单,可根据数据的特点来选择适合自己的方法。在日常开发中,如果遇到繁琐的重复运算,也可以通过 Boyer-Moore Majority Vote 算法来提高效率。