2013-08-29 41 views
14

我有以下列表元素,列表长度为100个元素。如何在python中压扁元组

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

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

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

回答

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

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

+1

答案中的链接到底如何帮助解决这个问题? – GreenAsJade

+2

当你知道元组结构时,它可以工作,但有时它需要被平坦化的原因是因为结构是未知的。例如np.where可以返回一个具有单值的元组或者具有值列表的元组,在这种情况下,元组需要以不同的方式访问。这种情况如何处理? – DanGoodrick

+0

@DanGoodrick:np.where不这样做。该元组从不包含列表;它总是一个numpy数组的元组,除了具有0维数组的奇怪边缘情况外,数组的数量总是等于输入数组的维数。在不同的情况下,不需要以不同的方式访问元组,而将其扁平化没有多大意义。 – user2357112

4

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

这可能是有用的,如果你有使用记录嵌套元组与许多你想要扁平化的元素保持一致。

1

您可以用这种方式

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

一个Python 2.7兼容的方式做什么米奇提出的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

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

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

希望它可以帮助别人:)