![](/img/trans.png)
[英]Is there a faster way to search whether a value is within an interval given a list of intervals?
[英]Is there a faster way to check if a number is within an interval?
我有一个这样排序的间隔列表:
intervals=['132-237','156-223','589-605',...]
然后,我得到一个数字,并想要确定它包含在哪个间隔中:
number=160 #number gotten
for lines in intervals:
lines=line.split(sep='-')
if number>=int(lines[0]) and number<=int(lines[1]):
record=record+1 #actually recording it more complicated
有没有办法没有for循环做到这一点?
您可以使用元组列表。
intervals = [(132,237),(156,223),(589,605)]
number = 160
for start, stop in intervals:
if start <= number <= stop:
print (start, stop)
当您明确要求不带for
循环的解决方案时,请查看Markku K对此答案的评论。
如果你想避免for
所有,我害怕走的路是递归的Python不切出。
这是我的解决方案:
def inside_interval(num, interval):
start, end = interval.split(sep='-')
return num in range(int(start), int(end))
和一些示例输出:
intervals = ['132-237', '156-223', '589-605']
print(inside_interval(150, intervals[0]))
print(inside_interval(123, intervals[1]))
print(inside_interval(600, intervals[2]))
# True, False, True
这里使用带for循环的示例(列表理解)。 如果您确实愿意,可以在这里使用其他构造,但是您有充分的理由这样做。
num = 160
intervals_list = [inside_interval(num, interval) for interval in intervals]
# intervals_list = [True, True, False]
这将为您提供与间隔列表相对应的布尔值输出。
我个人建议您将时间间隔转换为更有用的格式,而不要使用字符串。 这将使进行其他比较变得更加容易。
intervals = ['132-237','156-223','589-605']
intervals = [tuple(map(int, i.split('-'))) for i in intervals]
number = 160
for low,high in intervals:
if low <= number <= high:
print(number, "is between", low, "and", high)
break
当然,二进制搜索会更快:
intervals = ['132-237','156-223','589-605']
intervals = [tuple(map(int, i.split('-'))) for i in intervals]
def binSearch(number, intervals):
intervals.sort()
mid = len(intervals)//2 # a//b is in python3. Use len(intervals)/2 for python2
low,high = intervals[mid]
if number > high:
return binSearch(number, intervals[mid+1:])
elif number < low:
return binSearch(number, intervals[:mid])
elif low <= number <= high:
return (low,high)
else:
return "no appropriate interval exists"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.