Verschachtelte Listen glätten

Um was geht es eigentlich? Wir wollen aus einer verschachtelten Liste

   1 lst = ["a", ["b", ["c", "d"]]]

eine glatte (unverschachtelte) erstellen

   1 new_lst = ["a", "b", "c", "d"]

Dazu eignet sich ein rekursiver Generator. Und los gehts:

   1 def flatten(lst):
   2     for elem in lst:
   3         if isinstance(elem, (list, tuple)):
   4             for i in flatten(elem):
   5                 yield i
   6         else:
   7             yield elem

Wie verwendet man das nun?

   1 >>> lst = ["a", ["b", ["c", "d"]]]
   2 >>> new_lst = list(flatten(lst))
   3 >>> new_lst
   4 ['a', 'b', 'c', 'd']

oder

   1 >>> for i in flatten(lst): print i
   2 ...
   3 a
   4 b
   5 c
   6 d

Eine Alternative, die sämtliche Iterables, nicht nur Listen und Tupel "glättet":

   1 def flatten2(lst):
   2     for elem in lst:
   3         if isinstance(elem, basestring):
   4             yield elem
   5         else:
   6             try:
   7                 it = iter(elem)
   8             except:
   9                 yield elem
  10             else:
  11                 for i in flatten(elem):
  12                     yield i

Die Ausnahmeregelung für Strings ist dabei notwendig, weil deren Elemente wiederum Strings (von der Länge 1) sind.

Verschachtelte Listen glätten (last edited 2009-06-17 16:14:16 by localhost)