我发现了这个纯Python实现计算百分位数的方法(这里)和(这里):
import math
import functools
def percentile(N, percent, key=lambda x:x):
"""
Find the percentile of a list of values.
@parameter N - is a list of values. Note N MUST BE already sorted.
@parameter percent - a float value from 0.0 to 1.0.
@parameter key - optional key function to compute value from each element of N.
@return - the percentile of the values
"""
if not N:
return None
k = (len(N)-1) * percent
f = math.floor(k)
c = math.ceil(k)
if f == c:
return key(N[int(k)])
d0 = key(N[int(f)]) * (c-k)
d1 = key(N[int(c)]) * (k-f)
return d0+d1
我理解这个函数的基本原理,并且发现它能够正确运行:
>>> percentile(range(10),0.25)
2.25
我不太明白为什么要使用lambda函数key=lambda x:x
。
据我理解,这个lambda函数只是返回传递给它的值。基本上,如果我完全省略这个lambda函数,整个函数似乎会产生相同的结果:
import math
def percentile2(N, percent):
"""
Find the percentile of a list of values.
@parameter N - is a list of values. Note N MUST BE already sorted.
@parameter percent - a float value from 0.0 to 1.0.
@parameter key - REMOVED
@return - the percentile of the values
"""
if not N:
return None
k = (len(N)-1) * percent
f = math.floor(k)
c = math.ceil(k)
if f == c:
return N[int(k)]
d0 = N[int(f)] * (c-k)
d1 = N[int(c)] * (k-f)
return d0+d1
如果我测试这个:
>>> percentile2(range(10),0.25)
2.25
那么,这个 lambda 函数在这里有什么用处?