Python 如何找到中位数

Python 如何找到中位数,python,median,Python,Median,我有这样的数据 Ram,500 Sam,400 Test,100 Ram,800 Sam,700 Test,300 Ram,900 Sam,800 Test,400 从上述数据中细化“中值”的最短方法是什么。 我的结果应该是 中位数=1/2(n+1),其中n是样本中数据值的数量 Test 500 Sam 700 Ram 800 使用函数。有点不清楚数据实际上是如何表示的,所以我假设它是一个元组列表: data = [('Ram',500), ('Sam',400), ('Test',100)

我有这样的数据

Ram,500
Sam,400
Test,100
Ram,800
Sam,700
Test,300
Ram,900
Sam,800
Test,400
从上述数据中细化“中值”的最短方法是什么。 我的结果应该是

中位数=1/2(n+1),其中n是样本中数据值的数量

Test 500
Sam 700
Ram 800

使用函数。

有点不清楚数据实际上是如何表示的,所以我假设它是一个元组列表:

data = [('Ram',500), ('Sam',400), ('Test',100), ('Ram',800), ('Sam',700), 
        ('Test',300), ('Ram',900), ('Sam',800), ('Test',400)]

from collections import defaultdict

def median(mylist):
    sorts = sorted(mylist)
    length = len(sorts)
    if not length % 2:
        return (sorts[length / 2] + sorts[length / 2 - 1]) / 2.0
    return sorts[length / 2]

data_dict = defaultdict(list)
for el in data:
    data_dict[el[0]].append(el[1])

print [(key,median(val)) for key, val in data_dict.items()] 
print median([5,2,4,3,1])   
print median([5,2,4,3,1,6])
#output:
[('Test', 300), ('Ram', 800), ('Sam', 700)]
3
3.5
函数
median
从列表中返回中值。如果条目数为偶数,则取中间两个条目的中间值(这是标准值)


我曾经创建一个由数据及其值组成的dict,这是一种更有用的数据表示形式。

获取整数数据列表中值的最简单方法:

x = [1,3,2]
print "The median of x is:",sorted(x)[len(x)//2]
看看这个:

def median(lst):
    even = (0 if len(lst) % 2 else 1) + 1
    half = (len(lst) - 1) / 2
    return sum(sorted(lst)[half:half + even]) / float(even)
注:

sorted(lst)
生成
lst
的排序副本

sum([1])==1

Python 3.4包含内置的,因此您可以使用以下方法:


我从user3100512的答案开始,很快意识到它对偶数个项目不起作用。我添加了一些条件来计算中间值

def median(x):
    if len(x)%2 != 0:
        return sorted(x)[len(x)/2]
    else:
        midavg = (sorted(x)[len(x)/2] + sorted(x)[len(x)/2-1])/2.0
        return midavg

    median([4,5,6,7])

如果返回5.5

,如果您排除空列表上的
n=len(sorts)
median()崩溃,那么函数可能会更清晰一些。如果不是mylist,您可能需要在开始处添加
:返回0
。@OlivierBlanvillain它不会崩溃,但会引发异常,您可以捕获它。这是正确的行为,因为空列表的中位数是未定义的,绝对不是“0”(这是类似
[2,-1,0]
的中位数),我想这取决于您如何看待它。无论如何,对于我来说,为一个未定义的值捕获一个“索引器”似乎不是很习惯。可能会引发ValueError,或者返回None…如果您只是在寻找中值算法,请尝试查找://意味着截断除法(就像python 2.x中的普通除法一样),这当然是正确的,因为它不适用于偶数个元素。
def median(x):
    if len(x)%2 != 0:
        return sorted(x)[len(x)/2]
    else:
        midavg = (sorted(x)[len(x)/2] + sorted(x)[len(x)/2-1])/2.0
        return midavg

    median([4,5,6,7])