Python: Mapping from intervals to values

前端 未结 6 961
遥遥无期
遥遥无期 2020-11-30 00:58

I\'m refactoring a function that, given a series of endpoints that implicitly define intervals, checks if a number is included in the interval, and then return a correspondi

6条回答
  •  鱼传尺愫
    2020-11-30 01:37

    It is indeed quite horrible. Without a requirement to have no hardcoding, it should have been written like this:

    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
    

    Here are examples of creating a lookup function, both linear and using binary search, with the no-hardcodings requirement fulfilled, and a couple of sanity checks on the two tables:

    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
    

提交回复
热议问题