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

时间:2014-02-05 20:13:09

标签: python list

我有一个我按照这样排序的间隔列表:

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循环的情况下做到这一点?

3 个答案:

答案 0 :(得分:3)

您可以使用元组列表。

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不会被删除。

答案 1 :(得分:1)

这是我的解决方案:

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]

这会为您提供与您的间隔列表对应的布尔值输出。

我个人建议您将间隔转换为更有用的格式,而不是使用字符串。这样可以更容易地进行其他比较。

答案 2 :(得分:0)

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"