2017-11-22 17 views
3

I는 다음과 같습니다 그 튜플의 목록을 가지고 :파이썬에서 중첩 된 튜플 목록을 평탄하게 만드는 방법은 무엇입니까?

[('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

한 줄,

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')] 

이 인위적 목록을 만드는 지능형리스트를 노래. 단일 요소 목록을 만들지 않으려면 [x], (x for _ in range(1))도 작업을 수행 할 수 있습니다 (clunky로 보일지라도).

제한 : 둘 이상의 중첩 수준을 처리하지 못합니다. 어떤 경우에는 더 복잡한/재귀 적 솔루션을 코딩해야합니다.

+1

이것은 임의의 중첩을 처리하지 않습니다. –

+0

@MartijnPieters 당신의 재귀 솔루션은 그 일을 할 수있는 유일한 솔루션이며, 자외선을 가지고 있습니다. BTW는'(x for _ range (1)에 대해)'''[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

하나가 - 라인 솔루션을 사용하는 것입니다 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

여기 Ditto here : 이것은 임의의 중첩을 처리하지 않습니다. –