如何判断索引在元组列表中的所属分段并返回其序号
解决思路与实现代码
要返回索引所在的分段序号(从1开始计数),核心是遍历分段列表时同时跟踪每个分段的位置,而不是只判断是否存在符合条件的区间。这里给你两种实用的实现方式:
方式一:直观的循环遍历(易读性高)
用enumerate函数遍历列表,同时指定start=1让序号从1开始,这样直接就能得到分段的编号。找到匹配的区间后立即返回序号,没找到则返回None方便后续处理:
seg = [(874, 893), (964, 985), (1012, 1031)] target_index = 876 def get_segment_number(segments, target): # enumerate的start=1参数让序号从1开始计数 for seg_num, (start, end) in enumerate(segments, start=1): if start <= target <= end: return seg_num # 索引不在任何区间时返回None return None result = get_segment_number(seg, target_index) if result: print(f"index inside segment {result}") # 输出:index inside segment 1 else: print("index not in any segment")
方式二:简洁的生成器+next函数(代码更紧凑)
如果喜欢更简洁的写法,可以用生成器表达式配合next函数,一行获取结果,同时指定默认值处理无匹配的情况:
seg = [(874, 893), (964, 985), (1012, 1031)] target_index = 1015 # 从生成器中取第一个符合条件的分段序号,无匹配则返回None segment_num = next( (num for num, (s, e) in enumerate(seg, 1) if s <= target_index <= e), None ) if segment_num: print(f"index inside segment {segment_num}") # 输出:index inside segment 3 else: print("index not in any segment")
补充说明
- 两种方式都处理了边界值:比如索引等于区间的起始或结束值(如874、893),
<=会正确判定为在区间内。 - 原来的代码只是生成了一个非空列表来判断存在性,但没有跟踪分段位置,而
enumerate正好解决了这个问题——它能同时拿到元素的位置和值。
内容的提问来源于stack exchange,提问作者konstantin
相关产品推荐
相关产品推荐

