如何将嵌套深度不同的元组列表转换为扁平化元组列表?
问题:扁平化嵌套元组列表
我有一个如下形式的嵌套元组列表:
p = [((4.0, 4.0), '->', ((4, 2), (4, 8)), ((2, 2), (5, 5))), ((4.0, 7.0), '->', ((4, 2), (4, 8)), ((5, 6), (3, 8)))]
希望将其转换为如下形式的扁平化元组列表:
p = [(4.0,4.0), (4, 2), (4, 8), (2, 2), (5, 5), (4.0, 7.0), (4, 2), (4, 8), (5, 6), (3, 8)]
我尝试了以下代码:
res = [] for tup in p: for sub_tup in tup: print sub_tup, type(sub_tup) if type(sub_tup) == tuple: res.append(sub_tup) print(res)
但输出仍存在嵌套元组:
[(4.0, 4.0), ((4, 2), (4, 8)), ((2, 2), (5, 5)), (4.0, 7.0), ((4, 2), (4, 8)), ((5, 6), (3, 8))]
请问该如何解决?
解决方案
你的代码仅处理了一层嵌套,遇到((4,2),(4,8))这类二级元组时直接将整个元组加入结果,没有继续拆分。可以通过两种方式解决:
方法1:针对当前数据结构的针对性处理
观察数据结构,每个顶层元组格式为(单点元组, '->', 元组对1, 元组对2),可直接提取并展开目标元素:
res = [] for item in p: # 提取第一个单点元组 res.append(item[0]) # 展开第三个元素的两个子元组 res.extend(item[2]) # 展开第四个元素的两个子元组 res.extend(item[3]) print(res)
运行结果:
[(4.0, 4.0), (4, 2), (4, 8), (2, 2), (5, 5), (4.0, 7.0), (4, 2), (4, 8), (5, 6), (3, 8)]
方法2:通用递归扁平化函数
如果后续数据结构可能变化,可写一个通用递归函数,遍历所有嵌套结构并跳过非目标元素(如'->'):
def flatten_tuples(obj): result = [] if isinstance(obj, tuple): for elem in obj: result.extend(flatten_tuples(elem)) elif obj != '->': # 跳过不需要的符号 result.append(obj) return result res = [] for item in p: res.extend(flatten_tuples(item)) print(res)
该函数会递归拆解所有嵌套元组,最终得到符合要求的扁平化列表。
内容的提问来源于stack exchange,提问作者amit
相关产品推荐
相关产品推荐

