最好的方式映射一个值从范围数在python?



假设我们有一个这样的数据示例:

<表类> 机能水平tbody><<tr>0 ~ 50151 ~ 1002101 ~ 1503151 ~ 2004201 ~ 3005300年在6

考虑到范围并不都是相等的大小(对于1-4,范围是50,但对于5是100),您可以像这样使用sum()的生成器表达式:

def get_level_of_aqi(aqi):
return sum(l<=aqi for l in [0, 51, 101, 151, 201, 301])

这利用了True的值为1False的值为0的优势

以下是输出示例:

In [1]: get_level_of_aqi(50)
Out[1]: 1
In [2]: get_level_of_aqi(100)
Out[2]: 2
In [3]: get_level_of_aqi(125)
Out[3]: 3
In [4]: get_level_of_aqi(220)
Out[4]: 5
In [5]: get_level_of_aqi(280)
Out[5]: 5
In [6]: get_level_of_aqi(310)
Out[6]: 6

看看这个实现,让我知道它是否适合你。

def get_level_of_aqi(aqi):
if aqi > 0 and aqi <= 300:
return (aqi-1)//50 + 1
elif aqi >300:
return 6
else:
raise Exception("Please pass positive numbers")

如果你需要解释,请在下面评论。祝你今天愉快。

这个怎么样,它有一个字典映射。

# mapping
d = {
1: [0, 50],
2: [51, 100],
3: [101, 150],
4: [151, 200],
5: [201, 300]
}

def get_level_of_aqi(aqi):
if aqi < 0:
return None
for k, v in d.items():
if v[0] <= aqi <= v[1]:
return k
return 6  # above 300

aqi = -1
level = get_level_of_aqi(aqi)
print(f'aqi: {aqi}, level: {level}')

aqi = 60
level = get_level_of_aqi(aqi)
print(f'aqi: {aqi}, level: {level}')

aqi = 500
level = get_level_of_aqi(aqi)
print(f'aqi: {aqi}, level: {level}')
# aqi: -1, level: None
# aqi: 60, level: 2
# aqi: 500, level: 6

如果只想直接比较,也可以考虑使用range()

def get_level_of_aqi(aqi):
if aqi in range(0, 50 + 1):
level = 1
elif aqi in range(51, 100 + 1):
level = 2
elif aqi in range(101, 150 + 1):
level = 3
elif aqi in range(151, 200 + 1):
level = 4
elif aqi in range(201, 300 + 1):
level = 5
elif aqi > 300:
level = 6
else:
raise Exception("Please pass positive numbers")
return level

可能不花哨,但很清楚

from math import ceil

def get_level_of_aqi(aqi: int):
aqi = ceil((aqi or 1) / 50)
aqi = aqi > 5 and aqi - 1 or aqi
return min(aqi, 6)

另一个解决方案是创建一个二叉树,其中每个节点包含一个值,左侧分支只包含小于该值的值,右侧分支只包含大于该值的值。如果您的搜索项小于/大于分支中的项,则继续在左/右树中搜索。这个过程不断重复,直到你走不动为止。如果确保树是平衡的(例如,红黑树),最大搜索时间是O(log(n))。或者,您可以使用二分搜索。但是只有当你有很多类别和不规则的间隔时,这些解决方案才会奏效。

从最大值开始写if条件

def get_level_of_aqi(aqi):
level = None
if aqi > 300:
level = 6
elif 201 <= aqi <= 300:
level = 5
elif 151 <= aqi <= 200:
level = 4
elif 101 <= aqi <= 150:
level = 3
elif 51 <= aqi <= 100:
level = 2
elif 0 <= aqi <= 50:
level = 1
return level

print(get_level_of_aqi(50))
1
print(get_level_of_aqi(52))
2
print(get_level_of_aqi(4555))
6

最新更新