2017-09-11 95 views
0

是否有緊湊的oneliner或python習慣用語來處理以下任務?將元組展開爲嵌套列表

我想變換元組的列表清單是這樣的:

input = [[(1,2,3),(4,5,6)],[(7,8,9),(10,11,12)]] 

這樣:

output [[1,2,3,7,8,9], [4,5,6,10,11,12]] 

使用地圖和壓扁列表只給了我的follwing

input_trans = map(list, zip(*input)) 
input_trans_flat = [item for sublist in input_trans for item in sublist] 
Out: [(1, 2, 3), (7, 8, 9), (4, 5, 6), (10, 11, 12)] 

很多感謝提前!

+0

下一次,不遮蔽'輸入()與你的變量名 –

回答

2

我會怎麼做:

output = [list(a + b) for a, b in zip(*input)] 

zip部分,因爲你已經知道,調換表外列表。然後我抓住每對元組並將它們連接起來,然後將組合的元組變成列表。如果你不在乎最終是否有列表或元組列表,你可以擺脫list調用。

-1

這是一種方法。

from itertools import chain 
l = [[(1,2,3),(4,5,6)],[(7,8,9),(10,11,12)]] 
[list(chain.from_iterable(s)) for s in l] 

給我

[[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]] 
0

您可以使用list comprehensionzip()象下面這樣:

output = [[item for tup in (i, j) for item in tup] for i, j in zip(*input)] 

輸出:

>>> input = [[(1, 2, 3), (4, 5, 6)], [(7, 8, 9), (10, 11, 12)]] 
>>> 
>>> output = [[item for tup in (i, j) for item in tup] for i, j in zip(*input)] 
>>> output 
[[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]] 
2

你應該能夠概括Blckknght's answer到任意數量的列表內的元組,使用sum

output = [list(sum(x,())) for x in zip(*input)] 
print(output) 

[[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]] 
+0

是真的,我需要一個廣義解'函數。我在同時測試了這個解決方案: [list(chain.from_iterable(_))for _in zip(* data)]。當你用timeit測量時,你的速度幾乎快了一倍。謝謝 :) –