如何在Python中展平元组

问题描述 投票:0回答:7

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

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

如何将每个元素转换为如下所示?

[(50, 2.7387451803816479e-13, 219)]
python list tuples flatten
7个回答
20
投票
[(a, b, c) for a, (b, c) in l]

元组打包和拆包解决了问题。


14
投票

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

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


6
投票

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

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

希望它对某人有帮助:)


3
投票

对 @sagacity 答案的改进,这将重新运行一个生成器,使用

tuple
recursive
压平
yield

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

要将其变成

list
tuple
,请使用
list()
tuple()

list(flatten(nested_tuple))
tuple(flatten(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

1
投票

这样就可以得到结果了

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

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

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


0
投票

此代码适用于嵌套元组:

def flatten(args):
    try:
        iter(args)
        final = []
        for arg in args:
            final += flatten(arg)
        return tuple(final)
    except TypeError:
        return (args, )

flatten([1, 2, 3, 4])  # (1, 2, 3, 4)
flatten([1, [2, 3], 4])  # (1, 2, 3, 4)
flatten([1, [2, [3]], [[4]]])  # (1, 2, 3, 4)
© www.soinside.com 2019 - 2024. All rights reserved.