如何在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
如何在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
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')
pip3 install itunizer
中,以将中位数数据添加到查询结果中。干杯 - james-see(适用于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
numpy
包的人来说,statistics.median
非常有效。 - Filipe Manuelsorted()
函数对此非常有帮助。使用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
def median(data):
data.sort()
mid = len(data) // 2
return (data[mid] + data[~mid]) / 2.0
以下是更简洁的解决方案:
def median(lst):
quotient, remainder = divmod(len(lst), 2)
if remainder:
return sorted(lst)[quotient]
return sum(sorted(lst)[quotient - 1:quotient + 1]) / 2.
注意:答案已更改以纳入评论中的建议。
float(sum(…) / 2)
应该替换为 sum(…) / 2.0
;否则,如果 sum(…)
是整数,则会得到整数商的浮点版本。例如:float(sum([3, 4]) / 2)
是 3.0
,但 sum([3, 4]) / 2.0
是 3.5
。 - musiphillist.sort
避免使用sorted
创建新列表,并原地对列表进行排序。list
用作变量名,因为它会掩盖Python自己的列表。def median(l):
half = len(l) // 2
l.sort()
if not len(l) % 2:
return (l[half - 1] + l[half]) / 2.0
return l[half]
mylist.sort(); middle(mylist)
,但这显然是个人口味问题。我只是认为在可能的情况下应该将变异保留给方法。列表.sort()之所以返回None而不是列表本身,是为了使行为尽可能明显和清晰。在文档中隐藏所有内容就像在小字体中隐藏东西一样。 - Will S如果需要更快的平均运行时间,您可以尝试使用quickselect算法。在平均(和最佳)情况下,quickselect的性能为O(n)
,但在不利情况下可能会达到O(n²)
。
这是一个使用随机选择枢轴的实现:
import random
def select_nth(n, items):
pivot = random.choice(items)
lesser = [item for item in items if item < pivot]
if len(lesser) > n:
return select_nth(n, lesser)
n -= len(lesser)
numequal = items.count(pivot)
if numequal > n:
return pivot
n -= numequal
greater = [item for item in items if item > pivot]
return select_nth(n, greater)
def median(items):
if len(items) % 2:
return select_nth(len(items)//2, items)
else:
left = select_nth((len(items)-1) // 2, items)
right = select_nth((len(items)+1) // 2, items)
return (left + right) / 2
这段代码非常不优化,但即使进行了优化,也很难超过Tim Sort(CPython内置的sort
),因为它非常快速。我以前试过了,结果失败了。
def median(x):
x = sorted(x)
listlength = len(x)
num = listlength//2
if listlength%2==0:
middlenum = (x[num]+x[num-1])/2
else:
middlenum = x[num]
return middlenum
def median(array):
"""Calculate median of the given list.
"""
# TODO: use statistics.median in Python 3
array = sorted(array)
half, odd = divmod(len(array), 2)
if odd:
return array[half]
return (array[half - 1] + array[half]) / 2.0
一个简单的函数,用于返回给定列表的中位数:
def median(lst):
lst = sorted(lst) # Sort the list first
if len(lst) % 2 == 0: # Checking if the length is even
# Applying formula which is sum of middle two divided by 2
return (lst[len(lst) // 2] + lst[(len(lst) - 1) // 2]) / 2
else:
# If length is odd then get middle value
return lst[len(lst) // 2]
median
函数的一些示例:
>>> median([9, 12, 20, 21, 34, 80]) # Even
20.5
>>> median([9, 12, 80, 21, 34]) # Odd
21
如果您想使用库,只需简单地执行以下操作:
>>> import statistics
>>> statistics.median([9, 12, 20, 21, 34, 80]) # Even
20.5
>>> statistics.median([9, 12, 80, 21, 34]) # Odd
21