纯Python实现计算百分位数:这里lambda函数的用途是什么?

3

我发现了这个纯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 函数在这里有什么用处?

刚刚编辑了percentile2()函数中最后一个调用“key”函数的部分。 - jov14
3个回答

7
答案就在文档字符串中(即在def语句后面开始的字符串):
@parameter key - optional key function to compute value from each element of N.

这使您可以使用除数字以外的其他列表。例如,您的lambda可能是lambda x:x.getRelevantValue(),而您的列表将包含具有getRelevantValue方法的对象。


谢谢你的解释。我之前没有理解那个文档行,因为我对lambda函数(以及Python中的对象)的熟悉程度还很有限。但是,如果我省略lambda函数,我的假设是这个百分位数函数在计算简单整数范围的所有百分位数时都能正确工作,这是正确的吗? - jov14
@John 我不能保证函数的正确性 ;) 但是使用默认的 lambda 函数,lambda 函数什么也不做,所以可以省略。 - Rob Watts

2

它就在函数的文档中:

@parameter key - optional key function to compute value from each element of N.

基本上,percentile 函数允许用户 可选地 传递一个键函数,该函数将应用于 N 的元素。由于它是可选的,因此它被赋予了默认值 lambda x:x,它不执行任何操作,因此即使用户省略了 key 参数,该函数也能正常工作。


谢谢,我读了那行文档,但我还没有理解它。我现在想我明白了,但我仍需要更多地熟悉lambda函数的灵活性。 - jov14

-5

这是一个决胜局,以防万一f等于c。你还没有遇到过这种情况,所以你的代码永远不会崩溃(因为key现在不存在)。


1
哇,回复速度真快。但是难道决胜者不是在条件语句中,返回N[int(k)],如果条件为真的话?(我只是忘记从那行代码中移除key函数了)。 - jov14

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接