查找列表的模式

blu*_*ern 108 python mode

给定项目列表,回想一下列表的模式是最常出现的项目.

我想知道如何创建一个可以找到列表模式但是如果列表没有模式则显示消息的函数(例如,列表中的所有项只出现一次).我想在不导入任何函数的情况下创建此函数.我正试图从头开始创建自己的功能.

Dav*_*Dao 135

您可以使用该max功能和一个键.使用'key'和lambda表达式查看python max函数.

max(set(list), key=list.count)
Run Code Online (Sandbox Code Playgroud)

  • 也可以使用`max(lst,key = lst.count)`.(而且我真的不会叫列表​​`列表`.) (16认同)
  • 在我看来,这将在'O(n**2)`中运行.可以? (12认同)
  • 这具有二次运行时 (7认同)
  • 这是OP的正确答案,因为它不需要任何额外的进口.干得好,大卫 (6认同)
  • 谁能解释这对双峰分布如何起作用?例如`a = [22,33,11,22,11]; print(max(set(a),key = a.count))`返回`11`。它将始终返回最小模式吗?如果是这样,为什么? (2认同)
  • @StefanPochmann你真的想要`max(set(lst), key=lst.count)`,原因是你只想为每个唯一元素运行一次list.count,而不需要`set`,即使输出是正确的,您最终会重新运行重复元素的计数。 (2认同)

Chr*_*tts 95

您可以使用具有-esque功能Countercollections包中提供的mode

from collections import Counter
data = Counter(your_list_in_here)
data.most_common()   # Returns all unique items and their counts
data.most_common(1)  # Returns the highest occurring item
Run Code Online (Sandbox Code Playgroud)

注意:Counter是python 2.7中的新增功能,在早期版本中不可用.

  • 问题表明用户想要从头开始创建一个函数 - 即没有导入. (18认同)
  • 最后一行返回一个列表,其中包含一个包含模式及其频率的元组.要获得一个模式,请使用`Counter(your_list_in_here).most_common(1)[0] [0]`.如果有多个模式,则返回任意一个模式. (2认同)
  • 如果有不止一种模式,我怎样才能返回这些数字中最大的一个? (2认同)

jab*_*edo 56

Python 3.4包含了方法statistics.mode,所以它很简单:

>>> from statistics import mode
>>> mode([1, 1, 2, 3, 3, 3, 3, 4])
 3
Run Code Online (Sandbox Code Playgroud)

您可以在列表中包含任何类型的元素,而不仅仅是数字:

>>> mode(["red", "blue", "blue", "red", "green", "red", "red"])
 'red'
Run Code Online (Sandbox Code Playgroud)

  • 在使用模式([1,1,1,1,2,3,3,3,4,4])时引发错误,其中1和3重复相同的时间.理想情况下,应返回最大但相同次数的最小数字.StatisticsError:没有唯一模式; 找到2个同样常见的值 (14认同)
  • 没有使用过这个3.4统计软件包,但是scipy.stats.mode将返回最小的,在这种情况下1.我会更喜欢在某些情况下抛出错误... (3认同)
  • python 3.8还添加了[`multimode`](https://docs.python.org/3/library/statistics.html#statistics.multimode),当有多个模式时返回多种模式。 (3认同)
  • @aman_novice,这个问题在Python 3.8中得到了解决。https://docs.python.org/3/library/statistics.html#statistics.mode (2认同)

Chr*_*ris 26

从一些统计软件(即SciPyMATLAB)中得到一个叶子,它们只返回最小的最常见值,因此如果两个值经常出现,则返回最小的值.希望一个例子可以帮助:

>>> from scipy.stats import mode

>>> mode([1, 2, 3, 4, 5])
(array([ 1.]), array([ 1.]))

>>> mode([1, 2, 2, 3, 3, 4, 5])
(array([ 2.]), array([ 2.]))

>>> mode([1, 2, 2, -3, -3, 4, 5])
(array([-3.]), array([ 2.]))
Run Code Online (Sandbox Code Playgroud)

你有什么理由不遵循这个惯例吗?

  • 为什么只有多个时才返回最小模式? (3认同)
  • @chrisfs 并使其返回最大模式(如果有多个)? (2认同)

mat*_*urd 23

有很多简单的方法可以在Python中找到列表模式,例如:

import statistics
statistics.mode([1,2,3,3])
>>> 3
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过计数找到最大值

max(array, key = array.count)
Run Code Online (Sandbox Code Playgroud)

这两种方法的问题在于它们不适用于多种模式.第一个返回错误,第二个返回第一个模式.

为了找到集合的模式,您可以使用此函数:

def mode(array):
    most = max(list(map(array.count, array)))
    return list(set(filter(lambda x: array.count(x) == most, array)))
Run Code Online (Sandbox Code Playgroud)

  • 使用该模式时,如果有两个元素出现的时间相同,则会产生错误。 (3认同)

Kar*_*omo 8

扩展在列表为空时不起作用的社区答案,这是mode的有效代码:

def mode(arr):
        if arr==[]:
            return None
        else:
            return max(set(arr), key=arr.count)
Run Code Online (Sandbox Code Playgroud)


tas*_*hka 5

如果您对最小、最大或所有模式感兴趣:

def get_small_mode(numbers, out_mode):
    counts = {k:numbers.count(k) for k in set(numbers)}
    modes = sorted(dict(filter(lambda x: x[1] == max(counts.values()), counts.items())).keys())
    if out_mode=='smallest':
        return modes[0]
    elif out_mode=='largest':
        return modes[-1]
    else:
        return modes
Run Code Online (Sandbox Code Playgroud)