在Python中找到列表的中位数
在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
(适用于 python-2.x):
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
>>> from numpy import median
>>> median([1, -4, -1, -1, 1, -3])
-1.0
对于 python-3.x,使用 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')