首页 文章

Python确定数字在哪个区间

提问于
浏览
0

我想在Python中运行一个 for 循环,在给定一定数量的间隔的情况下,为循环的每个元素检查它在哪个区间内 . 例如:

interval_1 = [1; 10]
interval_2 = [11; 58]

我正在寻找比大型 if/elif/else 条件更优雅的解决方案,例如我的想法是加载包含 n 对应于间隔末端的数字对的excel工作表,并使用一个函数来找到我的数字在哪个区间 .

Python中是否存在类似的功能?或者最终怎么做呢?

2 回答

  • 0

    numpy has nice support for this无需编写 for 循环:

    import numpy as np
    
    data = np.array([0.2, 6.4, 3.0, 1.6])
    bins = np.array([0.0, 1.0, 2.5, 4.0, 10.0])
    cats = np.digitize(data, bins)
    cats
    # array([1, 4, 3, 2])
    

    如果你坚持 for 循环,只需迭代元素到bin和bin:

    data = [0.2, 6.4, 3.0]
    bins = [(0.0, 1.0), (1.0, 4.0), (4.0, 10.0)]  # assumed (lower, upper] format
    cats = []
    
    for elem in data:
        for idx, bounds in enumerate(bins, start=1):
            if bounds[0] < elem <= bounds[1]:
                cats.append(idx)
                break
        else:
            raise ValueError('No bin for {}'.format(elem))
    

    以上使用元组来指定bin范围(如您的示例),但这在技术上并不必要(例如 numpy 代码) . 您可以只存储截止值并比较 cutoffs[:-1] 中的相邻元素 .

  • 1

    这里's a solution that should run faster if you have a very large list of ranges. It uses python' s bisect 模块执行binary search以快速查找项目所属的范围 .

    对于这个例子,我使用范围2..5,7..9和13..13 .

    代码检查0到14之间的所有数字是否都在提供的范围之一 .

    代码:

    from bisect import *
    
    ranges = [2, 5, 7, 9, 13, 13]   # Using this convention: 2..5, 7..9, 13..13. Assume ranges inclusive.
    for item in range(15):
        valid = False
        L = (bisect_left(ranges, item) // 2) * 2
        if L+1 < len(ranges):
            valid = ranges[L] <= item and ranges[L + 1] >= item
        print(item, valid)
    

    输出:

    0 False
    1 False
    2 True
    3 True
    4 True
    5 True
    6 False
    7 True
    8 True
    9 True
    10 False
    11 False
    12 False
    13 True
    14 False
    

相关问题