2012-11-16 4 views
1

가능한 중복 :
Flatten (an irregular) list of lists in Python파이썬 : 다중 중첩리스트

예 1

제가리스트가 있다고 가정하자 : [1,2], [ 3,4]. 나는 인쇄 할 수 있도록 루프 두 가지를 사용할 수 있습니다 : 1, 2, 3, 4

예 2 : 그래서

, 지금의 내가 출력을 제공하고있어 나는 '돈 있다고 가정하자 t는리스트 1 이내가 얼마나 중첩리스트 알고

목록 1 = 1 [1, 2, [3, 5, 6, [...], ...]]]]]

그래서 , 제 질문은 어떻게 첫 번째 예제와 같은 형식으로 모든 개별 번호를 인쇄 할 수있을 것입니다. 지금 당장 뭔가 중첩 된 목록을 결과로 제공하지만 함수에 대한 입력을 통해 중첩 목록의 양이 달라집니다. 내가 생각할 수있는 어떤

이 작업을 수행하는 것입니다,하지만 난 isinstance 부분 후에 무엇을 해야할지하지 않습니다

먼저 편집

하는 경우를

c = 0 
for i in list1: 
    while c < len(list1): 
     if isinstance(i, list): 

     else: 
       print i 
     c += 1 

감사가 모든 중첩 목록을 해체하여 나에게 적합한 단일 목록이되도록하는 방법이기도하지만,이 두 가지 문제에 대한 답변을 알고 싶습니다.

+0

을 와우, 모두 감사합니다. 아래의 모든 답은 저에게 도움이되었지만 정확하게 계산할 경우 artsiom의 알고리즘 big은 선형이어야하며 목록에 수천 개의 중첩 목록이 있기 때문에 이것은 이상적입니다. – TTT

+0

좋아요. 당신이 사용하는 대답을 수락하십시오 :) –

+0

오, 기다려주십시오. 모든 솔루션 큰 표기법은 n^n입니다. – TTT

답변

4

itertools documentation에는 목록을 반복하는 꽤 좋은 예가 나와 있으므로 항상 ag입니다. 그런 일에 직면했을 때 시작하는 장소.

나는이 목록의 많은 수준 만들지 않도록 발전기, 사용 권 해드립니다 것이다 :

def flatten_all(iterable): 
    for elem in iterable: 
     if not isinstance(elem, list): 
      yield elem 
     else: 
      for x in flatten_all(elem): 
       yield x 
      # in Python 3.3 just: yield from flatten_all(elem) 

응용 프로그램 :

for x in flatten_all([1, [2, [3]]]): 
    print(x) 

# or if you need a list: 
my_lst = list(flatten_all([1, [2, [3]]]) 
assert my_lst == [1, 2, 3] 

편집 : 비 재귀 선형 버전

def flatten_all(iterable): 
    stack = [iter(iterable)] 
    while stack: 
     try: 
      elem = stack[-1].next() 
      if not isinstance(elem, list): 
       yield elem 
      else: 
       stack.append(iter(elem)) 
     except StopIteration: 
      stack.pop() 
+0

이것이 올바른 방법이라고 생각합니다. 그것을 보면 내 솔루션만큼 빠를 것이라고 생각합니다. 그러나 발전기를 제작하기 때문에 훨씬 더 유연합니다. –

1

이 같은 (나중에 인쇄 할 수 있도록 코드 목록은 평면에서 하나의 행 수) 시도 할 수 있습니다 :

def make_flat(arr): 
    res = [] 
    for l in arr: 
     if isinstance(l, list):# or isinstance(l, collections.Iterable) 
      res.extend(make_flat(l)) 
     else: 
      res.append(l) 
    return res 

flat = make_flat(list1) 
for x in flat: 
    print x 

또는 :

def make_flat(arr): 
    return sum(map(lambda a: make_flat(a) if isinstance(a,(list)) else [a],arr),[]) 
+0

그런 종류의 큰 목록으로, 나는 다른 해결책을 시간을 잰다. –

+0

네, 맞습니다 - 왜 내가 수확량을 가진 해결책을 좋아 했는가하지만 여전히 OP가 원하는 것은하고있는 것입니까? 그것은 목록을 평평하게 만들고 그것을 출력합니다. 아무도 그것이 큰 목록의 권리를 위해 일해야한다고 말하지 않습니까? –

+0

예! @TTT는 그가 여기에서 (?) 주석을 제거했다는 코멘트를 남겼다. 그리고 나의 의견은 그것에 대한 반응이었다. 그것은 당신의 해결책에 대한 비평가가 아닙니다 :) –

1

이 재귀를 사용하여 예입니다 :

list1 = [1, [2,3,4], [5, 6, 7, [8, 9]]] 

def print_list(l): 
    for e in l: 
     if type(e) == list: 
      print_list(e) 
     else: 
      print e 

print_list(list1) 
+0

혹시 재귀에 대한 bigo 표기법을 알고 싶습니까? 내가 올바르게 보게되면 len (list) = n으로 가정하면 n^n이됩니다. – TTT

+1

나는 컴퓨터 과학자가이 목회자가 점심 시간을 갖는 것보다 더 잘 대답 할 것이라고 믿는다;) –

+0

당신이 말하는 것처럼, 그것은 당신이 "n"을 정의하는 방법에 달려있다. 그렇지 않으면 가로 지르는 나무도 n^n이됩니다. 그러나 트리와이 목록 (데이터는 잎에있는 나무와 같이 보입니다)의 경우, 일반적으로 트리 노드는 데이터 요소로 간주되기 때문에 직선으로 간주됩니다 (예 : 데이터베이스의 멀티 브랜치 트리, 복잡하고, n = d * log (d) 일 수 있습니다. 여기서 d는 실제 데이터 입력 (또는 인덱스의 키 수)입니다. –