2009-07-22 4 views
2

Gibt es eine Möglichkeit die folgenden in einer nicht-rekursive Art und Weise auszuführen:Nicht-rekursive Mittel zum Drucken einer Liste in Python

my_list = [ 
    "level 1-1", 
    "level 1-2", 
    "level 1-3", 
     [ 
      "level 2-1", 
      "level 2-2", 
      "level 2-3", 
      [ 
       "level 3-1", 
       "level 3-2" 
      ] 
     ], 
    "level 1-4", 
    "level 1-5" 
    ] 


def print_list(the_list, indent_level=0): 
    for item in the_list: 
     if isinstance(item, list): 
      print_list(item, indent_level + 1) 
     else: 
      print "\t" * indent_level, item 


print_list(my_list) 
+0

ist es ein Puzzle oder ist es wirklich ein Ort benötigt? Ich bin neugierig. –

+0

Nur versuchen, die effizienteste Lösung eines Problems wie folgt zu finden. Es ist kein Puzzle, aber der Code, den ich zur Verfügung gestellt habe, ist nur ein Beispiel. –

+0

Es ist auch ein Standard-CS-Algorithmus ersten oder zweiten Jahres. :) –

Antwort

4
stack = [(my_list, -1)] 
while stack: 
    item, level = stack.pop() 

    if isinstance(item, list): 
     for i in reversed(item): 
      stack.append((i, level+1)) 
    else: 
     print "\t" * level, item 
2
def print_list(the_list, indent_level=0): 
    stack = [iter(the_list)] 
    while stack: 
     try: 
      item = stack[-1].next() 
     except StopIteration: 
      stack.pop() 
      indent_level -= 1 
      continue 
     if isinstance(item, list): 
      indent_level += 1 
      stack.append(iter(item)) 
     else: 
      print "\t" * indent_level, item 
+0

Ein Stapel Iteratoren - süß. Ich mag meinen etwas besser (prägnanter und etwas schneller - für mich jedenfalls), aber dieser vermeidet es, eine Kopie des ganzen Baumes zu machen, was hilfreich sein kann, wenn er sehr groß und breit ist. Sie würden wahrscheinlich Millionen von Knoten brauchen, damit es wichtig ist. –

0

Beachten Sie, dass dies auf der Eingangs depens Tupel nicht enthält.

l1 = my_list 
done = False 

# Repeatedly turn the list elements into tuples of the form 
# (indent, item) until there are no more lists. 
while not done: 
    done = True 
    l2 = [] 
    for item in l1: 
     if isinstance(item,tuple): 
      indent = item[0] 
      item = item[1] 
     else: 
      indent = 0 
     if isinstance(item,list): 
      l2.extend(zip((indent + 1,) * len(item), item)) 
      done = False 
     else: 
      l2.append((indent,item)) 
    l1 = l2 

for indent, item in l1: 
    print "\t" * indent, item 
0

Jeder hat Lösungen, die

  • Produktion bereit
  • Verwendung Stapel sind gegeben, so gleiches Problem wie Rekursion
  • oder gehen Sie durch die Liste mehr Zeit
hat

Hier ist eine Lösung seitliche Lösung :)

  • nicht Produktion bereit, aber Spaß
  • kein Stapel oder so etwas, keine Listen in Sicht

-

def my_print(the_list): 
    level = -1 
    out = [] 
    levelUp="levelup" 
    levelDown="leveldown" 

    s = repr(the_list).replace("', '","\n").replace(
     "', ['", "\n%s\n"%levelUp).replace("['", "\n%s\n"%levelUp).replace(
     "']", "\n%s\n"%levelDown).replace("], '", "\n%s\n"%levelDown) 

    for line in s.splitlines(): 
     if not line: continue 
     if line == levelUp: 
      level+=1 
     elif line == levelDown: 
      level-=1 
     else: 
      print "\t"*level,line 

my_print(my_list) 

Es nimmt die Ihre Textliste wird nicht habe einige spezielle Teilstrings.

2

Hier ist eine Variante von Martin Löwis 'Version, die for/else statt StopIteration und len(stack) manuell abfängt, anstatt die Einzugsebene zu verfolgen.

def print_list(the_list): 
    stack = [iter(the_list)] 
    while stack: 
     for item in stack[-1]: 
      if isinstance(item, (list, tuple)): 
       stack.append(iter(item)) 
       break 
      else: 
       print '\t' * (len(stack)-1), item 
     else: 
      stack.pop()