用于计算百分位数的纯python实现:这里的lambda函数有什么用? |
您所在的位置:网站首页 › 百位取证函数 › 用于计算百分位数的纯python实现:这里的lambda函数有什么用? |
我在这里和这里偶然发现了这种纯Python实现来计算百分位数: 1234567891011121314151617181920212223import 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我了解了此函数的基本原理,并且看到它可以正常工作: 12>>> percentile(range(10),0.25) 2.25我没有得到的是lambda函数key=lambda x:x的作用。 据我所知,此lambda函数只是返回传递给它的值。 基本上,如果我完全省略此lambda函数,则整个函数似乎会产生相同的结果: 12345678910111213141516171819202122import 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如果我测试一下: 12>>> percentile2(range(10),0.25) 2.25那么,这里的lambda函数有什么用? 相关讨论 刚刚进行了编辑,以从percentile2()函数中删除"键"函数的最后一个调用答案就在docstring(在def语句之后的行上开始的字符串)中: 1@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函数不执行任何操作,因此可以省略。就在函数文档中: 1@parameter key - optional key function to compute value from each element of N.基本上,percentile函数允许用户有选择地传递一个将应用于N元素的键函数。由于它是可选的,因此已被赋予默认值lambda x:x,该值不执行任何操作,因此该函数起作用 即使用户省略了key参数。 相关讨论 谢谢,我读了那条文档行,但我听不懂。 我想我现在就明白了,但是我仍然必须更多地适应lambda函数的灵活性。万一f等于c,这是决胜局。 您没有遇到过这种情况,因此您的代码永不崩溃(因为key现在不存在)。 相关讨论 哇,反应很快。 但是,如果不是,则决胜局是否不是if语句返回N [int(k)]的情况? (我只是忘了从那一行删除键功能)。 抱歉,当我回答这些问题时,我倾向于相信提问者是准确的。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |