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