2013-08-29 97 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

希望它可以幫助別人:)