Python:从间隔映射到值

2024-06-10 01:42:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在重构一个函数,给定一系列隐式定义间隔的端点,检查间隔中是否包含数字,然后返回相应的(与任何可计算的方式无关)。 现在处理工作的代码是:

if p <= 100:
    return 0
elif p > 100 and p <= 300:
    return 1
elif p > 300 and p <= 500:
    return 2
elif p > 500 and p <= 800:
    return 3
elif p > 800 and p <= 1000:
    return 4
elif p > 1000:
    return 5

这在我看来是相当可怕的,并且缺少间隔和返回值都是硬编码的。 当然,任何数据结构的使用都是可能的。


Tags: and函数代码数据结构编码间隔returnif
3条回答
import bisect
bisect.bisect_left([100,300,500,800,1000], p)

这里是文件:bisect

你可以试试看:

def check_mapping(p):
    mapping = [(100, 0), (300, 1), (500, 2)] # Add all your values and returns here

    for check, value in mapping:
        if p <= check:
            return value

print check_mapping(12)
print check_mapping(101)
print check_mapping(303)

产生:

0
1
2

和Python中一样,有更好的方法可以做到这一点。

真是太可怕了。如果不要求没有硬编码,它应该是这样写的:

if p <= 100:
    return 0
elif p <= 300:
    return 1
elif p <= 500:
    return 2
elif p <= 800:
    return 3
elif p <= 1000:
    return 4
else:
    return 5

下面是创建查找函数的示例,包括线性查找和使用二进制搜索,但不满足硬编码要求,以及对这两个表的健全性检查:

def make_linear_lookup(keys, values):
    assert sorted(keys) == keys
    assert len(values) == len(keys) + 1
    def f(query):
        return values[sum(1 for key in keys if query > key)]
    return f

import bisect
def make_bisect_lookup(keys, values):
    assert sorted(keys) == keys
    assert len(values) == len(keys) + 1
    def f(query):
        return values[bisect.bisect_left(keys, query)]
    return f

相关问题 更多 >