测试某个数字是否在范围列表中

时间:2017-10-25 16:47:34

标签: python list range

如何测试某个数字超出范围列表的次数?

示例:

value = 1
Ranges_array = [[0, 2], [2, 4], [0, 3]]
output = 1

因此,生成的输出将为1,因为只有一个范围,其中1的值不在其中。

6 个答案:

答案 0 :(得分:4)

嗯,这些实际上不是Ranges,而是两个元素列表。您可以使用手动比较,就像在其他答案中一样,但在我的回答中,我将它们转换为实际的Range对象。

由于Python的range(a,b)构造函数包含在a(即a位于范围内),而bb的排他性位于sum(1 for a,b in Ranges_array if value not in range(a,b+1)) 之外范围),如果您希望它们都是包含端点或独占端,则必须添加1到一个端点。我认为你想要包容性,所以在高端点添加1:

import pandas as pd
import numpy as np

dates = pd.to_datetime(['2017-10-01','2017-10-02','2017-10-03'])

df = pd.DataFrame({ 
            'day_of_week': ['m','t','w'],
            'alpha': [1,2,3],
            'bravo': [4,5,6],
            'charlie': [7,8,9],
            'dates':dates
            })

def sum_(x):
    try:
        return np.sum(x)
    except:
        return np.nan

def max_(x):
    try:
        return np.max(x)
    except:
        return np.nan

agg_dik = {'alpha': sum_,
           'bravo': sum_,
           'charlie': max_,
           'delta': max_}

df = df.groupby('day_of_week').agg({k:v for k,v in agg_dik.items() if k in df}).reset_index(drop = True)

答案 1 :(得分:2)

您可以使用sum和生成器表达式:

>>> sum(not a <= value <= b for a, b in ranges_array)
1

ab分别是较低和较高的范围界限。 a <= value <= bchained comparison,相当于a <= value and value <= b。最终返回值是not a <= value <= b表达式计算为True的次数。

如果我们应用De Morgan定律,我们可以获得更长但更易读的解决方案:

>>> sum(value < a or value > b for a, b in ranges_array)
1

从技术上讲,可以使用range,如其他答案中所示,但在Python 3中它们会更慢(由于range对象的创建)和<在Python 2中,em>很多较慢(因为Python 2的range创建了一个实际列表,列表上的包含检查是 O(n)):

$ python3.6 -m timeit -s "a, b, value = 0, 1000, 500" "a <= value <= b"
10000000 loops, best of 3: 0.0343 usec per loop
$ python3.6 -m timeit -s "a, b, value = 0, 1000, 500" "value in range(a, b + 1)"
1000000 loops, best of 3: 0.28 usec per loop
$ python2.7 -m timeit -s "a, b, value = 0, 1000, 500" "value in range(a, b + 1)"
100000 loops, best of 3: 7.97 usec per loop

答案 2 :(得分:0)

列表理解力应该足够了。

output=len([k for k in Ranges_array if k[0]>value or k[1]<value])

答案 3 :(得分:0)

使用list comprehension

>>> sum([1 for x,y in ranges if not x<=value<=y])
=> 1

#OR

>>> len([1 for x,y in ranges if not x<=value<=y])
=> 1

使用generators (推荐它会更快)

>>> sum(1 for x,y in ranges if not x<=value<=y)
=> 1

#driver value:

IN : ranges = [[0,2], [2,4], [0,3]]

答案 4 :(得分:0)

你可以尝试:

value = 1
Ranges_array= [[0,2],
          [2,4],
          [0,3]]
output = 0
for r in Ranges_array:
    if value not in range(r[0], r[1]):
        output +=1

答案 5 :(得分:0)

只是一个解决方案:

my_value = 1
Ranges_array = [[0,2],[2,4],[0,3]]
output = 1

count = 0
for listt in Ranges_array:
    if not my_value in range(listt[0],listt[-1]):
        count+= 1

print count