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 次比较就可以了。

https://en.wikipedia.org/wiki/Segment_tree

您可能对 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'