使 Python 预排序模式函数处理 Multiple/No 模式

Make Python Pre-sort Mode Function Handle Multiple/No Mode

我特意想用Python模式的功能使用变身征服,写了下面的版本,我觉得基本正确(有错请指正)。然而,当有多种模式时,只给出一种,这在我看来在技术上是不正确的,因为这个值是“a”模式而不是“the”模式。

您建议如何修改函数来解决此问题?

def mode_presort(arr):
    arr.sort() # Array must be sorted before we apply the algorithm.
    i = 1
    mode_frequency = 0
    while i < len(arr):
        run_length = 1
        run_value = arr[i]
        while i + run_length < len(arr) and arr[i + run_length] == run_value:
            run_length += 1
        if run_length > mode_frequency:
            mode_frequency = run_length
            mode_value = run_value
        i += run_length
    return mode_value
    
arr = [1, 1, 1, 2, 2]
print(mode_presort(arr))  # Output: 1
arr = [1, 1, 2, 2]
print(mode_presort(arr))  # Output: 2

非常感谢任何帮助。

您的代码中存在一个错误:i 不应初始化为 1,而应初始化为 0。

要获得多个结果,让您的函数 始终 return 一个列表,即使只有一种模式。

然后,只需将频率 等于 的情况添加到您目前找到的最大值。所以 if 块应该更改为:

        if run_length > mode_frequency:
            mode_frequency = run_length
            mode_value = [run_value]  # Make it a list
        elif run_length == mode_frequency:  # Also deal with this case
            mode_value.append(run_value)  # Add alternative to existing list of modes

像往常一样,有些库已经提供了模式功能,例如 Pandas:

import pandas as pd

def mode(arr):
    return list(pd.Series(arr).mode())