Das Problem bei Zeichenketten ist, das deren Elemente wiederum Zeichenketten sind (welche nur ein Zeichen enthalten) und damit iterierbar sind. Um das Problem mit der Endlosrekursion zu beseitigen, habe ich eine Weiche vorgeschaltet, welche die Länge der Sequenz prüft. Praktisch ist, dass `len` einen auch TypeError wirft, wenn es keine Länge zu ermitteln gibt.
Minimal geänderte Funktion mit neuem test-case:
Code: Alles auswählen
def flatten(xs):
"""
>>> list(flatten([1, 2, [3, 4], [5, [6, 7]], 8]))
[1, 2, 3, 4, 5, 6, 7, 8]
>>> list(flatten([[1, 2], "FooBar", 3, 4]))
[1, 2, 'F', 'o', 'o', 'B', 'a', 'r', 3, 4]
"""
for x in xs:
try:
if len(x) > 1:
for e in flatten(iter(x)):
yield e
else:
yield x[0]
except TypeError: # x is not iterable OR has no len()
yield x
Hier stellt sich allerdings die Frage, wie man Zeichenketten behandeln möchte. Derzeit werden diese als Sequenz (von Zeichen) betrachtet. Möglich wäre auch eine Betrachung als "Einheit", jedoch müsste man hier auf den speziellen Typ prüfen, was ich gerne vermeiden möchte.
Grüße ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"