代码之家  ›  专栏  ›  技术社区  ›  konstantin

检查两个浮动是否在给定的范围列表中的任何一个范围内

  •  -1
  • konstantin  · 技术社区  · 6 年前

    我有两辆花车 no_a no_b 两个范围表示为包含上下边界的两个元素列表。

    [0, 0.33] , [0.33, 0.66] ,或 [0.66, 1.0] .

    5 回复  |  直到 6 年前
        1
  •  6
  •   timgeb    6 年前

    如果你只是想得到一个 True False 因此,请考虑以下几点。

    >>> a = 0.4
    >>> b = 0.6
    >>> 
    >>> ranges = [[0,0.33], [0.33,0.66], [0.66,1.0]]
    >>> 
    >>> any(low <= a <= high and low <= b <= high for low, high in ranges)
    True
    

    如果您有任意数量的数字要检查(不仅仅是 a b

    >>> numbers = [0.4, 0.6, 0.34]
    >>> any(all(low <= x <= high for x in numbers) for low, high in ranges)
    True
    
        2
  •  1
  •   Poolka    6 年前

    这样地:

    RANGES = [[0,0.33], [0.33,0.66], [0.66,1.0]]
    
    
    def check(no_a, no_b):
        for rng in RANGES:
            if rng[0] < no_a < rng[1] and rng[0] < no_b < rng[1]:
                return True
        else:
            return False
    
    
    print(check(.1, .2))
    print(check(.1, .4))
    

    True
    False
    

    或者像这样:

    no_a, no_b = .1, .2
    print(any(rng[0] < no_a < rng[1] and rng[0] < no_b < rng[1] for rng in RANGES))
    no_a, no_b = .1, .4
    print(any(rng[0] < no_a < rng[1] and rng[0] < no_b < rng[1] for rng in RANGES))
    

    输出为:

        3
  •  0
  •   Shintlor    6 年前

    看一看 here

    把你的 no_a no_b 并检查是否所有事件都通过了您的语句。


    第二次编辑: all 对于这个小数据集,函数的性能优于numpy版本,因此取消了numpy的使用:

    ranges = [[0,0.33], [0.33,0.66], [0.66,1.0]]
    
    for i in range(len(ranges)):
        if all([ranges[i][0] < no_a < ranges[i][1], 
                ranges[i][0] < no_b < ranges[i][1]]):
            print('Both values are in the interval of %s' %ranges[i])
    

        4
  •  0
  •   piRSquared    6 年前

    Numpy使用广播

    import numpy as np
    
    check = np.array([[0.4], [0.6]])
    ranges = np.array([[0,0.33], [0.33,0.66], [0.66,1.0]])
    
    ((check >= ranges[:, 0]) & (check <= ranges[:, 1])).all(0).any()
    
    True
    

    细节

    check >= ranges[:, 0]
    
    #  0.00  0.33  0.66     <
    [[ True  True False]  # 0.4
     [ True  True False]] # 0.6
    

    check <= ranges[:, 1]
    
    #  0.33  0.66  1.00      >     
    [[False  True  True]   # 0.4
     [False  True  True]]  # 0.6
    

    a = (check >= ranges[:, 0]) & (check <= ranges[:, 1])
    a
    
    #  0.00  0.33  0.66      <
    #  0.33  0.66  1.00      >     
    [[False  True False]   # 0.4
     [False  True False]]  # 0.6
    

    check 要在一个范围对中,一列的所有内容都必须是 True

    a.all(0)
    
    [False  True False]
    

    只要有一个是 是的

    a.all(0).any()
    
    True
    

    纽皮雷杜

    然而,我们本可以改变 检查 ranges 进行一次比较操作。

    b = [1, -1]
    (check.T * b >= ranges * b).all(1).any()
    
    True