我有一个我按照这样排序的间隔列表:
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循环的情况下做到这一点?
答案 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"