25

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

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

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

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

6 回答 6

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

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

于 2013-08-29T00:40:06.067 回答
11

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

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

于 2016-06-06T07:39:52.080 回答
4

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

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

希望它可以帮助某人:)

于 2017-11-08T12:32:39.317 回答
2

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

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

要将其变为listor tuple,请使用list()or 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
于 2020-11-21T00:39:48.853 回答
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)]

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

于 2017-06-29T09:40:33.527 回答
1

你可以通过这种方式得到结果

>> example =  [(50, (2.7387451803816479e-13, 219))]
>>> [tuple(x[:1]) + (x[1]) for x in example] 
[(50, 2.738745180381648e-13, 219)]
于 2017-03-16T12:14:34.687 回答