如何在python中展平元组

Posted

技术标签:

【中文标题】如何在python中展平元组【英文标题】:How to flatten a tuple in python 【发布时间】:2013-09-01 06:32:47 【问题描述】:

我有一个列表的以下元素,该列表有 100 个元素。

[(50, (2.7387451803816479e-13, 219))]

如何将每个元素转换成这样?

[(50, 2.7387451803816479e-13, 219)]

【问题讨论】:

【参考方案1】:
[(a, b, c) for a, (b, c) in l]

Tuple packing and unpacking 解决了这个问题。

【讨论】:

答案中的链接究竟如何帮助解决这个问题? 当您知道元组结构时,这很有效,但有时需要将其展平的原因是结构未知。例如np.where 可以返回具有单个值的元组或具有值列表的元组,在这种情况下,需要以不同的方式访问元组。这种情况如何处理? @DanGoodrick:np.where 不这样做。元组从不包含列表;它始终是一个 numpy 数组的元组,除了 0 维数组的奇怪边缘情况外,数组的数量始终等于输入数组的维数。没有必要在不同的情况下以不同的方式访问元组,扁平化它没有多大意义。【参考方案2】:

Python 3.5 中的新增功能,在PEP 448 中引入了额外的元组解包,您可以在元组文字中使用星号表达式,以便您可以使用

>>> l = [(50, (2.7387451803816479e-13, 219)), (40, (3.4587451803816479e-13, 220))]
>>> [(a, *rest) for a, rest in l]
[(50, 2.738745180381648e-13, 219), (40, 3.458745180381648e-13, 220)]

如果您有一个嵌套元组用于记录保存许多要展平的元素,这可能会很有用。

【讨论】:

【参考方案3】:

您可以使用以下函数并将其循环应用到列表中的每个元素。

def flatten(data):
    if isinstance(data, tuple):
        if len(data) == 0:
            return ()
        else:
            return flatten(data[0]) + flatten(data[1:])
    else:
        return (data,)

它是如何工作的:

首先会检查类型是否为元组,如果不是,则“元组”参数 如果元组为空,则第二行返回一个空元组 第三行取出第一个元素并递归调用函数

这个解决方案的好处是:

不必知道给定元组的结构 元组可以任意嵌套深度 适用于 Python 2.2+(可能更早)

代码略微改编自以下来源:https://mail.python.org/pipermail/tutor/2001-April/005025.html

希望它可以帮助某人:)

【讨论】:

【参考方案4】:

对@sagacity 答案的改进,这将重新运行生成器,使用recursiveyieldtuple 展平。

def flatten(data):
    if isinstance(data, tuple):
        for x in data:
            yield from flatten(x)
    else:
        yield data

要使其成为listtuple,请使用list()tuple()

list(flatten_tuple(nested_tuple))
tuple(flatten_tuple(nested_tuple))

如果它需要在 Python 2 中工作,请将 yield from 替换为另一个循环:

def flatten(data):
    if isinstance(data, tuple):
        for x in data:
            for y in flatten(x):
                yield y
    else:
        yield data

【讨论】:

【参考方案5】:

这样就可以得到结果

>> example =  [(50, (2.7387451803816479e-13, 219))]
>>> [tuple(x[:1]) + (x[1]) for x in example] 
[(50, 2.738745180381648e-13, 219)]

【讨论】:

【参考方案6】:

一种与 Python 2.7 兼容的方式来执行 Mitch 为 Python 3.5 建议的操作。

>>> example =  [(50, (2.7387451803816479e-13, 219)),
            (100, (3.7387451803816479e-13, 218))]
>>> [(lambda *x: x)(k, *r) for k, r in example]
[(50, 2.738745180381648e-13, 219), (100, 3.7387451803816477e-13, 218)]

这种方法的优点是您不必像接受的答案那样为内部元组的每个值找到一个变量名来展平。如果有两个或三个项目,那不是真正的问题,但想象一下有十分之一或更多的值......

【讨论】:

以上是关于如何在python中展平元组的主要内容,如果未能解决你的问题,请参考以下文章

如何将元组列表展平为pythonic列表[重复]

如何展平嵌套元组?

如何在 Python 中完全展平列表? [复制]

如何在python中将展平表转换为嵌套(分层)json?

pythonic方法来展平嵌套列表? [复制]

展平 3D NumPy 数组中的内部元组并作为浮点数保存到 CSV