2017-11-22 12 views
3

私はこのようになりますタプルのリストがあります。これを行うには、最もPython的な方法は何Pythonでネストされたタプルのリストを平坦化する方法は?

[('a', 'b'), ('c', 'd'), ('e', 'f'), ('h', 'i')] 

[('a', 'b'), ('c', 'd'), (('e', 'f'), ('h', 'i'))] 

私はこれにそれを有効にすると?

+0

[不規則なリストのリストを作成する](https://stackoverflow.com/questions/2158395/flatten-an-irregular-list-of-lists) – GPhilo

+0

重複しているとは思わない彼はペアを維持したいので、 – L3viathan

+0

確かに、私はフラグを引っ込めました – GPhilo

答えて

3

一行、U

l = [('a', 'b'), ('c', 'd'), (('e', 'f'), ('h', 'i'))] 

result = [z for y in (x if isinstance(x[0],tuple) else [x] for x in l) for z in y] 

print(result) 

利回り:

[('a', 'b'), ('c', 'd'), ('e', 'f'), ('h', 'i')] 

要素はタプルのタプルでない場合、これは人為的にすべての仕事をして平坦化、その後、リストを作成しているリストの内包を歌います。

制限:1つの要素リストを作成しないように、(x for _ in range(1))はジョブを実行することもできます(制限は1レベル以上は処理できません)。この場合、より複雑な/再帰的な解をコード化する必要があります。

+1

これはもちろん、任意のネスティングを処理しません。 –

+0

@MartijnPietersあなたの再帰的な解決策は、それを行うことができ、私のUVを持っている唯一の解決策です。 BTWは '(x for _ range(1)for)in' '' '[x]'リストの作成を避けるのに適していますか、それとも良い方法がありますか? –

5

値のタプルがある場合のみ、非平坦化にcanonical un-flatten recipeを調整します。

def flatten(l): 
    for el in l: 
     if isinstance(el, tuple) and any(isinstance(sub, tuple) for sub in el): 
      for sub in flatten(el): 
       yield sub 
     else: 
      yield el 

はこれが唯一のタプルをアンラップし、その中に他のタプルが存在する場合にのみ:

>>> sample = [('a', 'b'), ('c', 'd'), (('e', 'f'), ('h', 'i'))] 
>>> list(flatten(sample)) 
[('a', 'b'), ('c', 'd'), ('e', 'f'), ('h', 'i')] 
3

1は、 -line溶液は、itertools.chainを使用することになる。

>>> l = [('a', 'b'), ('c', 'd'), (('e', 'f'), ('h', 'i'))] 
>>> from itertools import chain 
>>> [*chain.from_iterable(x if isinstance(x[0], tuple) else [x] for x in l)] 
[('a', 'b'), ('c', 'd'), ('e', 'f'), ('h', 'i')] 
+3

ここに同意します:これはもちろん、任意のネストを処理しません。 –

関連する問題