在Python中找到列表的中位数

285 投票
29 回答
799854 浏览
提问于 2025-04-18 08:59

在Python中,如何找到一个列表的中位数呢?这个列表可以有任意大小,而且里面的数字不一定是按顺序排列的。

如果列表里的元素数量是偶数,那么这个函数应该返回中间两个数字的平均值。

下面是一些例子(为了展示方便,已经排好序):

median([1]) == 1
median([1, 1]) == 1
median([1, 1, 2, 4]) == 1.5
median([0, 2, 5, 6, 8, 9, 9]) == 6
median([0, 0, 0, 0, 4, 4, 6, 8]) == 2

29 个回答

13

这里有一个更简洁的解决方案:

def median(lst):
    quotient, remainder = divmod(len(lst), 2)
    if remainder:
        return sorted(lst)[quotient]
    return sum(sorted(lst)[quotient - 1:quotient + 1]) / 2.

注意:这个回答已经根据评论中的建议进行了修改。

19

当然,在Python3中你可以使用内置函数,但如果你在用Python2,或者想自己写一个函数,可以这样做。这里的窍门是使用~这个运算符,它可以把正数变成负数。例如,~2会变成-3。在Python中,使用负数来处理列表时,会从列表的末尾开始计数。所以如果你有mid == 2,那么它会取出从开头算起的第三个元素和从末尾算起的第三个元素。

def median(data):
    data.sort()
    mid = len(data) // 2
    return (data[mid] + data[~mid]) / 2.0
75

sorted()这个函数非常有用。你可以用它来给列表排序,然后直接返回中间的值(如果列表的元素数量是偶数,就取中间两个值的平均数)。

def median(lst):
    sortedLst = sorted(lst)
    lstLen = len(lst)
    index = (lstLen - 1) // 2
   
    if (lstLen % 2):
        return sortedLst[index]
    else:
        return (sortedLst[index] + sortedLst[index + 1])/2.0
198

(适用于 ):

def median(lst):
    n = len(lst)
    s = sorted(lst)
    return (s[n//2-1]/2.0+s[n//2]/2.0, s[n//2])[n % 2] if n else None

>>> median([-5, -5, -3, -4, 0, -1])
-3.5

numpy.median():

>>> from numpy import median
>>> median([1, -4, -1, -1, 1, -3])
-1.0

对于 ,使用 statistics.median:

>>> from statistics import median
>>> median([5, 2, 3, 8, 9, -2])
4.0
331

Python 3.4 里有一个叫做 statistics.median 的功能:

它可以返回一组数字数据的中位数(也就是中间的那个数)。

如果数据点的数量是奇数,它会返回中间的那个数据点。 如果数据点的数量是偶数,它会通过取两个中间值的平均数来计算中位数:

>>> median([1, 3, 5])
3
>>> median([1, 3, 5, 7])
4.0

用法:

import statistics

items = [6, 1, 8, 2, 3]

statistics.median(items)
#>>> 3

它对数据类型也很讲究:

statistics.median(map(float, items))
#>>> 3.0

from decimal import Decimal
statistics.median(map(Decimal, items))
#>>> Decimal('3')

撰写回答