我需要根据另一个变量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的方式这样做?
答案 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)
我个人并不认为你需要一种不同的方式来做到这一点。它具有可读性,易懂性和高效性。它占用了一些空间,当然,打字有点痛苦,但我更喜欢代码占用一些空间而不是代码,我必须在以后完全理解这些代码。
如果你正在使用大量的音域,你可能需要更紧凑的东西以避免乏味和低效的时间使用,但在这种情况下,我没有看到改变任何东西的充分理由。