根据另一个变量的值为变量赋值的优雅方式

时间:2015-02-27 21:20:19

标签: python

我需要根据另一个变量b在一系列值中的位置来指定变量a的值。

这就是我目前所做的事情:

if a > 2.:
    b = 10
elif 1. < a <= 2.:
    b = 15
elif 0.5 < a <= 1.:
    b = 20
elif 0.2 < a <= 0.5:
    b = 25
elif a <= 0.2:
    b = 30

这很有效,但它并不漂亮。有没有更优雅/ pythonic的方式这样做?

5 个答案:

答案 0 :(得分:3)

bisect功能与一对列表一起使用。

import bisect
a_values = [0, 0.2, 0.5, 1.0, 2.0]
b_values = [30, 25, 20, 15, 10]
b = b_values[bisect.bisect_left(a_values, a)-1]

答案 1 :(得分:0)

我会在计算b时执行以下操作:

for x, b in zip([2., 1., 0.5, 0.2, 0.0], range(10, 35, 5)):
    if a > x:
        break

或者如果您愿意:

b = 10 + 5 * next(i for i, v in enumerate([2., 1., 0.5, 0.2, 0.0]) if a > v)

或者:

b = 5 * next(i for i, v in enumerate([2, 1, 0.5, 0.2, 0], 2) if a > v)

答案 2 :(得分:0)

b值及其下边界保存到

dic = {0.2: 30, 0.5: 25, 0.5: 20, 1: 20, 2: 10}

通过大于/等于测试中的数字来过滤字典的键,并找到最小值:

keys_sufficient = filter(lamba k: k <= a, dic.keys())
b = dic[max(keys_sufficient)]

答案 3 :(得分:0)

您可以将边界定义为dict,然后搜索。

def search(val_in):
    bounds = { (float('inf'), 2.): 10, (1., 2.): 15, ... (0.2, float('-inf')): 30}
    for (upper, lower), val_out in bounds.items():
        if (upper > val_in > lower):
            return val_out

答案 4 :(得分:0)

我个人并不认为你需要一种不同的方式来做到这一点。它具有可读性,易懂性和高效性。它占用了一些空间,当然,打字有点痛苦,但我更喜欢代码占用一些空间而不是代码,我必须在以后完全理解这些代码。

如果你正在使用大量的音域,你可能需要更紧凑的东西以避免乏味和低效的时间使用,但在这种情况下,我没有看到改变任何东西的充分理由。