如何测试某个数字超出范围列表的次数?
示例:
value = 1
Ranges_array = [[0, 2], [2, 4], [0, 3]]
output = 1
因此,生成的输出将为1,因为只有一个范围,其中1的值不在其中。
答案 0 :(得分:4)
嗯,这些实际上不是Ranges,而是两个元素列表。您可以使用手动比较,就像在其他答案中一样,但在我的回答中,我将它们转换为实际的Range对象。
由于Python的range(a,b)
构造函数包含在a
(即a
位于范围内),而b
(b
的排他性位于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
a
和b
分别是较低和较高的范围界限。 a <= value <= b
是chained 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