如何将嵌套元组转换为指定包含区间的配对列表
嵌套元组转包含区间列表的实现方案
问题描述
我有一段代码会返回带嵌套括号的元组,这些元组代表交替的排除区间与包含区间。示例嵌套元组如下:
((None, 6), 16)
以及
(((None, 1), 6), 16)
需要将它们转换为仅保留包含区间的配对列表,转换规则通过以下示例说明:
((None, 6), 16) 应转换为 [(6, 16)] (((None, 1), 6), 16) 应转换为 [(0,1), (6, 16)] ((None, 8), 17) 应转换为 [(8, 17)] (((None, 2), 8), 17) 应转换为 [(0, 2), (8, 17)] (((((None, 2), 3), 4), 8), 17) 应转换为 [(0, 2), (3, 4), (8, 17)]
核心规则:若开括号数量为偶数,则第一个区间为排除区间,需省略。例如:
((((None, 2), 4), 5), 6) 应转换为 [(2, 4), (5, 6)]
实现思路
- 拆解嵌套元组:递归遍历嵌套元组,提取所有区间端点(包括
None),整理成有序的端点列表。比如((((None,2),3),4),8),17)会被拆解为[None,2,3,4,8,17]。 - 判断起始区间类型:通过端点列表长度计算总区间数(端点数量-1),若区间数为偶数,第一个区间是排除区间需跳过;若为奇数,第一个区间是包含区间需保留。
- 生成包含区间:遍历端点两两配对,将
None替换为0,根据起始规则筛选出所有需要保留的包含区间。
Python 实现代码
def parse_nested_tuple(t): # 递归提取所有端点 endpoints = [] def extract(node): if isinstance(node, tuple): if len(node) == 2: extract(node[0]) endpoints.append(node[1]) else: endpoints.append(node) extract(t) interval_count = len(endpoints) - 1 # 区间数为偶数时,第一个是排除区间,需跳过 skip_first = interval_count % 2 == 0 result = [] for i in range(interval_count): start = endpoints[i] if endpoints[i] is not None else 0 end = endpoints[i+1] # 根据规则判断是否保留当前区间 if (i == 0 and skip_first) or (i % 2 == 1 and not skip_first): continue result.append((start, end)) return result
验证示例
测试给定的所有案例:
# 示例1 print(parse_nested_tuple(((None, 6), 16))) # 输出: [(6, 16)] # 示例2 print(parse_nested_tuple((((None, 1), 6), 16))) # 输出: [(0, 1), (6, 16)] # 示例3 print(parse_nested_tuple(((((None, 2), 3), 4), 8), 17)) # 输出: [(0, 2), (3, 4), (8, 17)] # 规则验证示例 print(parse_nested_tuple(((((None, 2), 4), 5), 6))) # 输出: [(2, 4), (5, 6)]
代码逻辑说明
- 递归提取端点:
extract函数递归遍历嵌套元组,按顺序收集所有端点,确保区间顺序正确。 - 跳过规则判断:总区间数为偶数时,第一个区间是排除区间,后续交替保留包含区间;奇数时直接从第一个区间开始交替保留。
- 区间转换:自动将
None替换为0,筛选符合要求的区间并整理成列表返回。
内容的提问来源于stack exchange,提问作者Simd
相关产品推荐
相关产品推荐

