Python 根据另一个变量的值为变量赋值的优雅方式
我需要根据另一个变量Python 根据另一个变量的值为变量赋值的优雅方式,python,Python,我需要根据另一个变量a在一个值范围内的位置来分配变量b的值 这就是我目前所做的: 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 如果a>2: b=10 elif 1.
a
在一个值范围内的位置来分配变量b
的值
这就是我目前所做的:
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
如果a>2:
b=10
elif 1.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
值及其下边界保存到
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)]
keys\u fulfuld=filter(lamba k:k使用带有一对列表的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]
您可以将边界定义为一个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
我个人认为你不需要另一种方式来实现这一点。它可读、易懂、高效。当然,它会占用一些空间,而且打字有点麻烦,但我更喜欢占用一些空间的代码,而不是我以后必须查找才能完全理解的代码
如果您使用的范围非常大,您可能需要更紧凑的方式来避免繁琐和低效的时间使用,但在这种情况下,我看不出有什么好的理由来更改任何内容。bounds={(float('inf'),2.):10,(1,2.):15,…}
--如果它在边界之间,则返回值。我认为您自己的方法没有太大错误,至少它是可读的b
和a
之间的关系的性质是什么?您能从a
计算b
并四舍五入到最近的5吗?我同意Padraic。此外,当前的方法也是非常有效。任何其他操作都会降低性能,因为它需要函数调用、构建数据结构等。您的0.2
应该为3025@PadraicCunningham你是对的,它应该是左对分的,更正了。你的第二个函数看起来好多了,尽管使用一个函数来处理这个问题可能有点过分了LH.+1你说服了我……但是为什么有人讨厌函数呢?:pOh这种同龄人的压力……我希望你现在批准……哎呀,我有个小插曲:)这实际上是一个很好的答案。现在你让我怀疑我应该接受哪一个。。。
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