2017-09-11 9 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]] 

マップを使用してリストを平坦化は、私だけ

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)] 
をfollwingを与えました

多くのおかげでアドバンス!

+0

次の時間は、はい確かに私は一般的なソリューションを必要とし –

答えて

2

を与える:

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

zip部分、あなたはすでに知っているように、リストの外側のリストを転置。次に、私はタプルの各ペアをつかみ、それらを連結し、結合されたタプルをリストに変換します。最後にリストのリストやタプルのリストがあるかどうか気にしない場合は、listコールを取り除くことができます。

-1

ここには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

あなたは以下のようにzip()list comprehensionを使用することができます。

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

あなたはsumを使用して、リスト内のタプルの任意の数にBlckknght's answerを一般化することができるはずです。

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で測定した場合、あなたの速度はほぼ2倍速くなりました。ありがとうございました :) –

関連する問題