2012-07-16 3 views
8

다른 생성기 또는 iteables를 생성하는 생성기를 병합 할 수있는 파이썬 함수를 작성하는 방법을 알고 싶습니다. gen - gen 후 괄호 콘텐츠 gen 수율 발생기 것이다 데이터 발생기 목적 의미Python : 다른 생성기를 포함하는 생성기를 병합하는 함수

gen(gen(1,2,3), gen(4,5,6), [7,8,9], [gen(10,11,12), gen(13,14,15)])

주 : 여기

예이다.

"병합"후 예상 된 결과 : gen(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)

패턴 화 된 기능이 너무 발전기를 반환하는 것이 필요하다! (그렇지 않기 때문에, 발전기의 이전 사용법은 의미가 없을 것이다).

참고로 파이썬 3을 사용하고 있습니다.

고마워요!

답변

12

가장 쉬운 방법은 재귀 적 병합 함수입니다. 당신이 문자열을 제외한 모든 반복자로 하강 할 가정하면, 당신이 할 수 있습니다 : 파이썬 3.3에서 시작

def flatten(it): 
    for x in it: 
     if (isinstance(x, collections.Iterable) and 
      not isinstance(x, str)): 
      for y in flatten(x): 
       yield y 
     else: 
      yield x 

, 당신은 또한 비 재귀 방법은 본질적으로 풀림입니다

def flatten(it): 
    for x in it: 
     if (isinstance(x, collections.Iterable) and 
      not isinstance(x, str)): 
      yield from flatten(x) 
     else: 
      yield x 
+0

대단히 감사합니다! 내 시도로 나는 너의 것에 아주 가까이 있었다 :-) 안부! – JoshuaBoshi

+0

+1 - 나는 'yield from'을 잊어 버렸고 이것은 좋은 알림이었습니다. –

+2

@JonClements : 아직 출시되지 않은 Python 버전의 기능을 "잊어 버리고"계속 하시겠습니까? 놀랐어요. :) –

0

쓸 수 있습니다 재귀 적 메서드, 스택 사용 :

def flatten(it): 
    stack = [] 
    it = iter(it) 
    while True: 
     try: 
      x = next(it) 
     except StopIteration: 
      if stack: 
       it = stack.pop() 
       continue 
      else: 
       return 
     if isinstance(x, collections.Iterable) and not isinstance(x, str): 
      stack.append(it) 
      it = iter(x) 
     else: 
      yield x 
관련 문제