如何在Python中高效地检查连续的范围

3

根据范围分配等级:

def getGrade(size):
    grade =''
    if size <= 32:
        grade = 'p4'
    elif size > 32 and size <=64:
        grade = 'p6'
    elif size > 64 and size <= 128:
        grade = 'p10'
    elif size > 128 and size <= 256:
        grade = 'p15'
    elif size > 256 and size <=512:
        grade = 'p20'
    elif size > 512 and size <= 1024:
        grade = 'p30'
    elif size > 1024 and size <= 2048:
        grade = 'p40'
    ......

问题是需要再增加20个检查,是否有比这种方法更好的方式。


2
创建一个 dict,以 range 对象 (作为键) 和成绩字符串 (作为值) 为元素? - UnholySheep
1
范围的上下限总是2^n吗? - Sohaib Farooqi
1
开始时,先放弃所有的最小值检查 - 它们不需要,因为之前的 if 语句已经触发了。 - Patrick Artner
1
如果 size < 32:做某事 elif size < 64:做某事等等。如果它是33,您不需要检查“>32 and <=64”作为第二个条件。如果小于33,则第一个条件将被触发。这大致可以减少50%的语句 - 但使用最大值:标签字典会更好。 - Patrick Artner
1
就像@PatrickArtner所说的那样。因此,您不需要所有这些双重测试。但是,当您确实需要这样的双重测试时,最好编写32<size<=64而不是size>32 and size<=64 - PM 2Ring
显示剩余3条评论
2个回答

5
由于范围是连续的,您可以避免重复下限。
将所有范围放入元组中可以节省一些打字时间(如果第一个范围不向负无穷延伸,请考虑在所有其他范围之前添加元组(0,None))。
def getGrade(size):
    grades = (
         (32, 'p4'),
         (64, 'p6'),
        (128, 'p10'),
        ...
    )

    for maxVal, grade in grades:
        if size <= maxVal:
            return grade

测试:

>>> getGrade(45)
'p6'
>>> getGrade(100)
'p10'

效率:

如果grades列表非常长,您可以比扫描每个项目更快地运行。由于该列表已排序,因此可以使用bisect,通过替换for循环来实现:

    for maxVal, grade in grades:
        if size <= maxVal:
            return grade

使用:

    index = bisect.bisect(grades, (size, ))
    if index < len(grades):
        return grades[index][1]

在最坏情况下,步骤数量从N(即grades的长度)减少为log2(N)。


1
还是返回 return next((grade for s, grade in grades if size <= s), None) - hiro protagonist
2
@hiroprotagonist,这只有一行,但是在令牌数量方面它更长。无论如何,在代码长度方面的挑战在这里都是愚蠢的;重点是“冗长”的for循环更易读。(尽管我非常喜欢单行表达式) - fferri
@fferri 我不得不承认:我同意! - hiro protagonist

0

一种暴力的方法是很简单的:

all_grades = [i for i in chain(repeat('p4',32),repeat('p6',64-32) and so on)]

then you can get grade as

grade = all_grades[size-1]

如果列表是指数级别的,可能需要更多的空间。


如果范围是20以上,那么最高范围就是2147483648,绝对是一种浪费空间! - fferri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接