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.