如何在python中展平元组

时间:2013-08-29 00:36:56

标签: python list tuples flatten

我有一个列表的以下元素,列表长度为100个元素。

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

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

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

6 个答案:

答案 0 :(得分:14)

[(a, b, c) for a, (b, c) in l]

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

答案 1 :(得分:5)

使用PEP 448中引入的附加元组解包的Python 3.5新增功能,您可以在元组文字中使用已加星标的表达式,以便您可以使用

>>> 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)]

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

答案 2 :(得分:1)

您可以通过这种方式获得结果

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

答案 3 :(得分:1)

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)]

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

答案 4 :(得分:0)

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

import type

def flatten(T):
    if type(T) != types.TupleType: return (T,)
    elif len(T) == 0: return ()
    else: return flatten(T[0]) + flatten(T[1:])

工作原理:

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

这个解决方案的好处是:

  • 没有必要知道给定元组的结构
  • 元组可以任意嵌套
  • 适用于Python 2.7

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

希望它可以帮助某人:)

答案 5 :(得分:0)

@sagacity答案的一项改进,它将重新运行使用tuplerecursive使yield变平的生成器。

def flatten_tuple(inp):
    for inp2 in inp:
        if not isinstance(inp2,tuple):
            yield inp2
        elif len(inp2) == 0:
            continue
        else:
            yield from flatten_tuple(inp2)

要将其设置为listtuple,请使用list()tuple()

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