Python中列表的中位数

时间:2016-06-08 15:15:14

标签: python list

我查了类似的帖子,人们发布的例子就像我自己的版本一样向我抛出同样的错误。我一直得到错误“列表索引必须是整数,而不是浮点数。”我相信我在获得中位数背后的逻辑很好,但我无法弄清楚如何解决这个问题。我知道这种情况正在发生,因为5/2 = 2.5并且这不是一个有效的索引,但在这种情况下我怎么能得到偶数列表的中位数呢?

我的简短代码是:

def median(lst):

    lst.sort()

    a = len(lst)

    if a % 2 == 0:
        b = lst[len(lst)/2]
        c = lst[(len(lst)/2)-1]
        d = (b + c) / 2
        return d

    if a % 2 > 0:
        return lst[len(lst)/2]

myList = [1,8,10,11,5]
myList2 = [10,5,7,2,1,8]

print(median(myList))
print(median(myList2))

我尝试这样做以修复它但仍然出现同样的错误:

def median(list):

    list.sort()

    a = float(len(list))

    if a % 2 == 0:
        b = float(list[len(list)/2])
        c = float(list[(len(list)/2)-1])
        d = (b + c) / 2.0
        return float(d)

    if a % 2 > 0:
        return float(list[len(list)/2])

myList = [1,8,10,11,5]
myList2 = [10,5,7,2,1,8]

print(median(myList))
print(median(myList2))

7 个答案:

答案 0 :(得分:5)

异常是由在{3.}上返回/的{​​{1}}运算符引起的。在计算索引时使用整数除float

//

答案 1 :(得分:3)

在python版本3中更好的方法是使用模块统计信息

import statistics

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

statistics.median(items)

如果你想要一个功能,试试这个。

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

你也可以使用我经常使用的numpy.median():

import numpy
def median(l):
    return numpy.median(numpy.array(l))

答案 2 :(得分:2)

还有一些关于修复浮动问题的答案。但是要回答关于长度列表的问题,请访问Google:

  

中位数也是该组中途的数字。要找到中位数,数据应按从最小到最大的顺序排列。如果数据集中有偶数个项目,则通过取两个最中间数字的平均值(平均值)找到中位数。

所以你需要做(list[len/2]*list[(len/2)-1])/2(对于0个索引数组减1,对1个索引数组加1)

答案 3 :(得分:1)

使用math.floor

import math

l = sorted([1,8,10,11,5])
m = l[int(math.floor(len(myList)/2))]       # 8

@schwobaseggl 所述,只需使用l[len(l)//2]

或者使用Python模块statistics进行Python 3.4 +,

>>> from statistics import median
>>> median([1,8,10,11,5])
8

答案 4 :(得分:1)

在我的头脑中,这似乎是有效的方法,完全避免模数:

def median(lst):
    lst.sort()
    half = len(lst)//2  # integer division
    b = lst[half]
    c = lst[-half-1]  # for odd lengths, b == c
    return (b + c) / 2

> median([1,8,10,11,5])
8.0
> median([10,5,7,2,1,8])
6.0

答案 5 :(得分:1)

np.mean用作math.floor

import math
import numpy as np

def get_median(list_):
    list_.sort()
    if len(list_)%2 == 0:
        return np.mean([list_[(len(list_)//2)-1], list_[((len(list_)//2))]])
    else:
        return list_[math.floor(len(list_)/2)]

答案 6 :(得分:0)

这是我的方法。计算变量med时,只需将除数设为浮点数即可得到小数。

def median(num_list):
    num_list.sort()
    x = len(num_list)
    if x % 2 == 0:     # for even lengths
        a = num_list[x / 2]
        b = num_list[(x / 2) - 1]
        med = float((a + b) / 2.0)
        return "Even listed median is %s" % med
    else:              # for odd lengths
        index = x / 2
        return "Odd listed median is %s" % num_list[index]
print median([1,2,3,4])