Python中列表的中间值

Python中列表的中间值,python,list,Python,List,我已经找到了类似的帖子,人们发布的例子都在向我抛出同样的错误,就像我自己的版本一样。我一直得到这样一个错误:“列表索引必须是整数,而不是浮点。”我相信我得到中间值的逻辑是正确的,但我不知道如何解决这个问题。我知道这是因为5/2=2.5,这不是一个有效的索引,但在这种情况下,我应该如何得到偶数列表的中位数呢 我的短代码是: def median(lst): lst.sort() a = len(lst) if a % 2 == 0: b = lst[l

我已经找到了类似的帖子,人们发布的例子都在向我抛出同样的错误,就像我自己的版本一样。我一直得到这样一个错误:“列表索引必须是整数,而不是浮点。”我相信我得到中间值的逻辑是正确的,但我不知道如何解决这个问题。我知道这是因为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))
使用

正如@schwobasegll所提到的,只需使用
l[len(l)//2]


或者使用Python 3.4+的Python模块

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

异常是由Python 3.x上返回
浮点值的
/
运算符引起的。计算索引时,请使用整数除法
/

>>> 2 / 1
2.0
>>> 2 // 1
2

在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))

关于解决浮动问题,还有其他一些答案。然而,要回答您关于偶数长度列表的问题,请从谷歌:

中位数也是集合中一半的数字。为了找到中位数,数据应该按照从最小到最大的顺序排列。如果数据集中的项目数为偶数,则取最中间两个数字的平均值(平均值)来计算中位数


所以你需要做
(list[len/2]*list[(len/2)-1])/2
(0索引数组减1,1索引数组加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

这就是我的方法。当计算变量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])

使用
np.平均值
as
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)]

在我的脑海里,我想你只需要
b=list[int(len(list)/2)+1]
。注意第二个
if
应该是
else:
可能是我试图创建一个得到中值的函数的副本,或者我只需要导入数学并使用它。int(math.floor(len(myList)/2))
len相同吗(myList)//2
?我支持这个答案,因为它实际上指出,偶数长度数据集的中值不是简单地通过取上/下一个偶数索引的值来计算的。
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)]