如何在python中展平元组

oll*_*wer 16 python tuples list flatten

我有一个列表的以下元素,列表是100个元素长.

[(50, (2.7387451803816479e-13, 219))]
Run Code Online (Sandbox Code Playgroud)

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

[(50, 2.7387451803816479e-13, 219)]
Run Code Online (Sandbox Code Playgroud)

use*_*ica 14

[(a, b, c) for a, (b, c) in l]
Run Code Online (Sandbox Code Playgroud)

元组打包和拆包解决了这个问题.

  • 答案中的链接对这个问题有何帮助? (2认同)
  • 当你知道元组结构时,这是有效的,但有时它需要被平整的原因是因为结构是未知的.例如,np.where可以返回具有单个值的元组或带有值列表的元组,在这种情况下,需要以不同方式访问元组.如何处理这种情况? (2认同)

sag*_*ity 6

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

def flatten(data):
    if isinstance(data, tuple):
        if len(data) == 0:
            return ()
        else:
            return flatten(data[0]) + flatten(data[1:])
    else:
        return (data,)
Run Code Online (Sandbox Code Playgroud)

怎么运行的:

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

这个解决方案的好处是:

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

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

希望它对某人有帮助:)


mir*_*ulo 5

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)]
Run Code Online (Sandbox Code Playgroud)

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