Alle Elemente aus verschachtelten Datentypen
Verfasst: Montag 23. März 2009, 14:33
Hi, angeregt durch diesen Thread habe ich mal eine rekursive Funktion geschrieben, die alle Elemente einer Liste zurückgibt (ohne Verschachtelungen).
Klappt wunderbar, wenn ich das Beispielsweise so aufrufe:
Aber aus Generator Expressions oder so kann man ja auch noch einzelne Elemente extrahieren, also habe ich mal versucht eine allgemeinere Funktion zu schreiben, die wie in der Überschrift angedeutet alle verschachtelten Datenstrukturen (kann man das so nennen?) auflöst und mir nur die Elemente zurückgibt.
Klappt wunderbar, nur sagt er mir, wenn ich ein Dictionary, Tuple oder sonstiges ohne append-Methode reinpacke, kommt folgendes folgendes:
Ich kann mir nur nicht erklären, wieso newiter oder items (nur auf diese Objekte wende ich append() an) plötzlich den Typ dict oder tuple haben.
Natürlich ist auch abgesehen von der Lösung meines Problems wie immer auch Kritik an anderen Punkten erwünscht.
Das ist übrigens nur Spielerei, ich brauche so eine Funktion eigentlich nicht (sonst würde ich die wahrscheinlich zur Sicherheit auch eher iterativ schreiben)
Code: Alles auswählen
def get_all_items(oldlist, items = []):
newlist = []
for i in oldlist:
if type(i) == list and len(i) > 0:
for j in i:
newlist.append(j)
else:
items.append(i)
if len(newlist) > 0:
return get_all_items(newlist, items)
else:
return items
Code: Alles auswählen
>>> print get_all_items([1, 2, [3, 4, [5, 6, []], 7], 8, 9])
>>> [1, 2, 8, 9, 3, 4, 7, 5, 6, []]
Code: Alles auswählen
def get_all_items(olditer, items = []):
newiter = []
for i in olditer:
if hasattr(i, '__iter__'):
for j in i:
newiter.append(j)
else:
items.append(i)
if len(newiter) > 0:
return get_all_items(newiter, items)
else:
return items
>>> print get_all_items([1, 2, [3, 4, [5, 6, [], (x for x in range(9))], 7], 8, 9])
>>> [1, 2, 8, 9, 3, 4, 7, 5, 6, 0, 1, 2, 3, 4, 5, 6, 7, 8]
Code: Alles auswählen
items.append(i)
AttributeError: 'tuple' object has no attribute 'append'
Natürlich ist auch abgesehen von der Lösung meines Problems wie immer auch Kritik an anderen Punkten erwünscht.
Das ist übrigens nur Spielerei, ich brauche so eine Funktion eigentlich nicht (sonst würde ich die wahrscheinlich zur Sicherheit auch eher iterativ schreiben)