Python - 根据值范围分配类别
Python - assigning categories based on value range
已解决
我想弄清楚为什么我的解决方案是错误的。两者都做了,第二个是正确的。我更喜欢第一个,因为间隔更易于管理,也更适合我糟糕的编程大脑。坦率地说,对于 pH 8(中性)及更高(溶液 2)会发生什么,我有点迷茫。因此,我想继续以这种方式为未来的任务工作,而不是解决方案 2(正确)。但是,我更喜欢的解决方案 1 是错误的 returns 弱 尽管它应该是 强酸性 为什么会这样,怎么会这样固定了吗?
Def:根据 pH (2.3) 分配类别
pH 和类别
0–2 强酸性
3–5 弱酸性
6–8 中性
9–11 弱基础
12–14 强基础
pH 值超出范围
def pH2Category(pH):
if pH < 0 or pH > 14:
category = "pH out of range"
elif (pH >=0) and (pH < 3):
category = "Strongly acidic"
elif (pH >=3) and (pH < 6):
category = "Weakly acidic"
elif (pH >=5) and (pH < 9):
category = "Neutral"
elif (pH >=9) and (pH < 12):
category = "Weakly basic"
else:
category = "Strongly basic"
return category
print(pH2Category(2.3))
def pH2Category(pH):
if pH < 0 or pH > 14:
category = "pH out of range"
elif pH < 3:
category = "Strongly acidic"
elif pH < 6:
category = "Weakly acidic"
elif pH <= 8:
category = "Neutral"
elif pH <= 11:
category = "Weakly basic"
else:
category = "Strongly basic"
return category
print(pH2Category(2.3))
有很多方法可以完成您所做的事情,但这里有一种方法可以帮助您从 python 着手,让您的生活更轻松
# dictionary of (min_value, max_value): 'Description of Ph'
# just fill out for your needs
table = {
(0, 3): 'Strongly Acidic',
(3, 6): 'Wakly Acidic',
(6, 9): 'Neutral',
...
}
def check_ph(ph):
for ph_range, ph_description in table.items():
# for every pair that you see in table
if ph_range[0] <= ph < ph_range[1]:
# if ph is greater or eqaual than min_value
# and lesser than max_value
print(ph_description)
# return the ph description
return ph_description
# if the value is outside the table range just print it out
print('ph out of range')
如果您想坚持与您所知道的相似的模式,以下应该可行:
def pH2Category(pH):
if pH < 0 or pH > 14:
return "pH out of range"
elif (pH >= 0) and (pH < 3):
return "Strongly acidic"
elif (pH >= 3) and (pH < 6):
return "Weakly acidic"
elif (pH >= 6) and (pH < 9):
return "Neutral"
elif (pH >= 9) and (pH < 12):
return "Weakly basic"
else:
return "Strongly basic"
print(pH2Category(2.3))
请注意以上内容 a) return 'pH out of range',因此如果您只想打印而不是 returned,请将第一个 if 中的 return
替换为一个 print
语句,以及 b) 正如评论中提到的@quqa,你在 5-6 中有重叠的范围,所以我修复了它。
如果您想要可扩展的东西,您应该考虑使用线段树(对数速度查找)。
对于只有几个类别的东西,进行浪费比较很便宜,但即使有 5 个类别,您也可以进行 10 次比较,而 3-4 次比较就可以了。
您可能对 portion
感兴趣,这是我编写的一个提供区间结构和操作的库。它在 PyPI 上发布,因此您可以使用 pip install portion
.
轻松安装它
除此之外,它提供了一个 IntervalDict
class,其作用类似于 Python dict
,但接受范围作为键。
应用于您的示例:
>>> import portion as P
>>> d = P.IntervalDict()
>>> d[P.open(-P.inf, P.inf)] = 'pH out of range'
>>> d[P.closed(0, 2)] = 'Strongly acidic'
>>> d[P.closed(3, 5)] = 'Weakly acidic'
>>> ...
>>> d[1]
'Strongly acidic'
>>> d[300]
'pH out of range'
已解决
我想弄清楚为什么我的解决方案是错误的。两者都做了,第二个是正确的。我更喜欢第一个,因为间隔更易于管理,也更适合我糟糕的编程大脑。坦率地说,对于 pH 8(中性)及更高(溶液 2)会发生什么,我有点迷茫。因此,我想继续以这种方式为未来的任务工作,而不是解决方案 2(正确)。但是,我更喜欢的解决方案 1 是错误的 returns 弱 尽管它应该是 强酸性 为什么会这样,怎么会这样固定了吗?
Def:根据 pH (2.3) 分配类别
pH 和类别
0–2 强酸性
3–5 弱酸性
6–8 中性
9–11 弱基础
12–14 强基础
pH 值超出范围
def pH2Category(pH):
if pH < 0 or pH > 14:
category = "pH out of range"
elif (pH >=0) and (pH < 3):
category = "Strongly acidic"
elif (pH >=3) and (pH < 6):
category = "Weakly acidic"
elif (pH >=5) and (pH < 9):
category = "Neutral"
elif (pH >=9) and (pH < 12):
category = "Weakly basic"
else:
category = "Strongly basic"
return category
print(pH2Category(2.3))
def pH2Category(pH):
if pH < 0 or pH > 14:
category = "pH out of range"
elif pH < 3:
category = "Strongly acidic"
elif pH < 6:
category = "Weakly acidic"
elif pH <= 8:
category = "Neutral"
elif pH <= 11:
category = "Weakly basic"
else:
category = "Strongly basic"
return category
print(pH2Category(2.3))
有很多方法可以完成您所做的事情,但这里有一种方法可以帮助您从 python 着手,让您的生活更轻松
# dictionary of (min_value, max_value): 'Description of Ph'
# just fill out for your needs
table = {
(0, 3): 'Strongly Acidic',
(3, 6): 'Wakly Acidic',
(6, 9): 'Neutral',
...
}
def check_ph(ph):
for ph_range, ph_description in table.items():
# for every pair that you see in table
if ph_range[0] <= ph < ph_range[1]:
# if ph is greater or eqaual than min_value
# and lesser than max_value
print(ph_description)
# return the ph description
return ph_description
# if the value is outside the table range just print it out
print('ph out of range')
如果您想坚持与您所知道的相似的模式,以下应该可行:
def pH2Category(pH):
if pH < 0 or pH > 14:
return "pH out of range"
elif (pH >= 0) and (pH < 3):
return "Strongly acidic"
elif (pH >= 3) and (pH < 6):
return "Weakly acidic"
elif (pH >= 6) and (pH < 9):
return "Neutral"
elif (pH >= 9) and (pH < 12):
return "Weakly basic"
else:
return "Strongly basic"
print(pH2Category(2.3))
请注意以上内容 a) return 'pH out of range',因此如果您只想打印而不是 returned,请将第一个 if 中的 return
替换为一个 print
语句,以及 b) 正如评论中提到的@quqa,你在 5-6 中有重叠的范围,所以我修复了它。
如果您想要可扩展的东西,您应该考虑使用线段树(对数速度查找)。
对于只有几个类别的东西,进行浪费比较很便宜,但即使有 5 个类别,您也可以进行 10 次比较,而 3-4 次比较就可以了。
您可能对 portion
感兴趣,这是我编写的一个提供区间结构和操作的库。它在 PyPI 上发布,因此您可以使用 pip install portion
.
除此之外,它提供了一个 IntervalDict
class,其作用类似于 Python dict
,但接受范围作为键。
应用于您的示例:
>>> import portion as P
>>> d = P.IntervalDict()
>>> d[P.open(-P.inf, P.inf)] = 'pH out of range'
>>> d[P.closed(0, 2)] = 'Strongly acidic'
>>> d[P.closed(3, 5)] = 'Weakly acidic'
>>> ...
>>> d[1]
'Strongly acidic'
>>> d[300]
'pH out of range'