如何用最Pythonic的方式补全指定范围内的序列
实现序列补全的Pythonic方案
需求说明
给定一个数值范围(例如 0 到 14),以及一个包含至少一组升序子序列的嵌套列表(例如 [[6, 7], [10, 11, 12]]),需要编写函数在保留已有子序列完整性的前提下,补全该范围内的所有数字。最终输出需将范围内未被包含在子序列中的数字以单元素列表形式补充,示例输出为:
[[0], [1], [2], [3], [4], [5], [6,7], [8], [9], [10, 11, 12], [13], [14]]
Pythonic实现代码
def complete_seq(input_range, list_of_lists): # 建立元素到对应完整子序列的映射,同时记录已被覆盖的元素 elem_to_seq = {} covered_nums = set() for sub_seq in list_of_lists: for num in sub_seq: elem_to_seq[num] = sub_seq covered_nums.add(num) result = [] current = input_range[0] end = input_range[1] while current <= end: if current in elem_to_seq: # 直接加入完整子序列,并跳转到子序列末尾的下一个数字 target_seq = elem_to_seq[current] result.append(target_seq) current = target_seq[-1] + 1 else: # 未被覆盖的数字以单元素列表形式加入 result.append([current]) current += 1 return result # 测试示例 completed_list = complete_seq((0, 14), [[6, 7], [10, 11, 12]]) print(completed_list)
方案优势(Pythonic特性)
- 高效查找:利用字典实现元素到子序列的O(1)映射,避免了重复遍历子序列的冗余操作
- 简洁逻辑:通过
while循环遍历范围,结合子序列末尾跳转,确保逻辑清晰易懂 - 可读性优先:变量命名直观,代码结构扁平化,符合Python"可读性为王"的设计哲学
- 鲁棒性:自动跳过已处理的子序列元素,避免重复添加,同时兼容任意不重叠的升序子序列输入
内容的提问来源于stack exchange,提问作者Les_Salantes
相关产品推荐
相关产品推荐

