用于计算百分位数的纯 python 实现:这里的 lambda 函数有啥用?

Posted

技术标签:

【中文标题】用于计算百分位数的纯 python 实现:这里的 lambda 函数有啥用?【英文标题】:pure python implementation for calculating percentiles: what is the use of the lambda function here?用于计算百分位数的纯 python 实现:这里的 lambda 函数有什么用? 【发布时间】:2016-10-04 01:11:12 【问题描述】:

我偶然发现了这个用于计算百分位数的纯 python 实现 here 和 here:

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”函数调用 【参考方案1】:

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

【讨论】:

哇,这是一个快速响应。但是,如果它是 True,那么决胜局不是返回 N[int(k)] 的“if”语句吗? (我只是忘记从该行中删除关键功能)。【参考方案2】:

答案就在文档字符串中(从def 语句之后的行开始的字符串):

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

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

【讨论】:

感谢您的澄清。我只是不明白那个文档行,因为我对 lambda 函数(显然是 python 中的对象)的熟悉程度仍然有限​​。但是如果我省略 lamda 函数,我假设这个百分位函数在所有简单整数范围的情况下都能正确计算百分位是正确的,是吗? @John 我不能保证函数的正确性;)但是对于默认的 lambda 函数,lambda 函数什么都不做,因此可以省略。【参考方案3】:

就在函数的文档中:

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

基本上,percentile 函数允许用户可选地传递一个键函数,该函数将应用于 N 的元素。由于它是可选的,因此它被赋予了默认值 @987654323 @,它什么都不做,所以即使用户省略了key参数,该函数也能正常工作。

【讨论】:

谢谢,我阅读了该文档行,但我不明白。我想我现在明白了,但我仍然需要更多地习惯 lambda 函数的灵活性。

以上是关于用于计算百分位数的纯 python 实现:这里的 lambda 函数有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

值计数的百分位数

在Python中计算一次性计算多个百分位数percentilequantile

python使用pandas中的groupby函数和agg函数计算每个分组数据的两个分位数(例如百分之10分位数和百分之90分位数)

在 BigQuery 中计算百分位数

Python Pandas - 如何通过描述函数计算 25 个百分位数

Pandas .. 分位数函数是不是需要排序数据来计算百分位数?