繁体   English   中英

有没有一种更快的方法来检查数字是否在间隔内?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM