Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据另一个变量的值为变量赋值的优雅方式_Python - Fatal编程技术网

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