You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将嵌套深度不同的元组列表转换为扁平化元组列表?

问题:扁平化嵌套元组列表

我有一个如下形式的嵌套元组列表:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:51:37