python ранжирует значение из списка из процентиля списка, используя лямбду - PullRequest
0 голосов
/ 24 июня 2018

предположим, у меня есть список чисел, и я применил процентиль к этому списку, который возвращает следующий словарь

{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 лямбда?

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Без изменения функции f() я бы использовал next с генератором, при этом по умолчанию было установлено значение 100.

lambda y: next((x for x in [25, 50, 75] if y <= f(x)), 100)
0 голосов
/ 24 июня 2018

Вы можете создать список из вашего словаря, отсортированного по значению. Это преобразование необходимо, потому что словари не упорядочены, если вы не используете 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
...