在Python中查找元组列表中的范围值

1 投票
7 回答
6514 浏览
提问于 2025-04-16 04:35

我想要根据一个标准的身体质量指数(BMI)值来判断它属于哪个分类。比如说,如果某人的BMI是26.2,那他就属于“超重”这个范围。

我列出了一个包含这些值的元组列表(见下文),当然我也愿意尝试其他的数据结构。用SQL的BETWEEN语句来处理这个问题很简单,但我想用纯Python来实现,主要是因为这样可以减少一次数据库连接,同时也是为了练习用“纯”Python做更多的事情。

bmi_ranges = []
bmi_ranges.append((u'Underweight', u'Severe Thinness', 0, 15.99))
bmi_ranges.append((u'Underweight', u'Moderate Thinness', 16.00, 16.99))
bmi_ranges.append((u'Underweight', u'Mild Thinness', 17.00, 18.49))
bmi_ranges.append((u'Normal Range', u'Normal Range', 18.50, 24.99))
bmi_ranges.append((u'Overweight', u'Overweight', 25.00, 29.99))
bmi_ranges.append((u'Obese', u'Obese Class I', 30.00, 34.99))
bmi_ranges.append((u'Obese', u'Obese Class II', 35.00, 39.99))
bmi_ranges.append((u'Obese', u'Obese Class III', 40.00, 1000.00))

如果某个范围在元组列表中是完全匹配的,那用列表推导式遍历一下就很简单。但如果我想判断一个值是否在其他值的范围内,该怎么做呢?

7 个回答

0

我不太明白为什么不能仅仅通过遍历列表来做到这一点(我知道有更高效的数据结构,但这个方法很简单,遍历会更容易理解)。这样做有什么问题呢?

def check_bmi(bmi, bmi_range):
    for cls, name, a, b in bmi_range:
        if a <= bmi <= b:
            return cls # or name or whatever you need.
0

bmi = 26.2

这里有一段代码,它主要是用来处理身体质量指数(BMI)的分类。

首先,我们创建了一个空的列表,叫做bmi_ranges,用来存放不同的BMI范围和对应的分类。

接下来,我们往这个列表里添加了几个元组,每个元组里包含了四个部分:

  • 第一个部分是大类,比如“体重过轻”、“正常范围”、“超重”和“肥胖”。
  • 第二个部分是更具体的分类,比如“严重消瘦”、“中度消瘦”等等。
  • 第三个部分是这个分类的下限值,比如“严重消瘦”的下限是0,而“正常范围”的下限是18.50。
  • 第四个部分是这个分类的上限值,比如“肥胖III级”的上限是1000(实际上没有人会有这么高的BMI)。

最后一行代码的作用是:它会筛选出那些BMI值在某个范围内的分类。具体来说,它会找出bmi这个值在每个元组的第三个和第四个值之间的分类。

简单来说,这段代码就是用来判断一个人的BMI属于哪个健康分类的。

2
# bmi = <whatever>
found_bmi_range = [bmi_range for bmi_range
                   in bmi_ranges
                   if bmi_ranges[2] <= bmi <= bmi_ranges[3]
                  ][0]

你可以在列表推导式中添加 if 条件,这样可以过滤出哪些项目会被包含在结果中。

注意:你可能想调整你的范围设置,使用一个不包括上限的范围(也就是说像 [a,b) + [b,c) + [c,d) 这样的方式),然后把条件改成 a <= b < c,这样就不会遇到边界情况的问题了。

撰写回答