python使用lambda将列表中的值排在列表百分位数之外

时间:2018-06-24 13:56:51

标签: python dictionary lambda rank percentile

假设我有一个数字列表,并且在此列表上应用了百分位数,它返回了以下字典

{100: 2004807.0, 75: 11600.0, 50: 2559.5, 25: 316.0}

然后我创建了以下函数以返回相应百分比值

def f(x):
    return {
        25: 316.0,
        50: 2559.5,
        75: 11600.0,
        100: 2004807.0
    }[x]

现在,以下函数返回值的排名

def rank(y):
    if y <= f(25):
        return 25
    elif y <= f(50):
        return 50
    elif y <= f(75):
        return 75
    else:
        return 100

使用python lambda可以做到吗?

2 个答案:

答案 0 :(得分:1)

您可以从字典中构造一个按值排序的列表。除非您使用的是Python 3.7+,否则转换是必需的,因为不对字典进行排序。

然后在您的next中使用lambda和一个生成器表达式:

d = {100: 2004807.0, 75: 11600.0, 50: 2559.5, 25: 316.0}
d_rev = sorted(d.items(), key=lambda x: x[1])

val = 2000
res = (lambda x: next((k for k, v in d_rev if x <= v), 100))(val)

print(res)
# 50

答案 1 :(得分:1)

在不更改f()函数的情况下,我将next与生成器一起使用,同时提供默认值100。

lambda y: next((x for x in [25, 50, 75] if y <= f(x)), 100)