我查了类似的帖子,人们发布的例子就像我自己的版本一样向我抛出同样的错误。我一直得到错误“列表索引必须是整数,而不是浮点数。”我相信我在获得中位数背后的逻辑很好,但我无法弄清楚如何解决这个问题。我知道这种情况正在发生,因为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))
答案 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])