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 算法来提高效率。