Entschachteln von Listen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
EvilOrange
User
Beiträge: 2
Registriert: Freitag 10. Mai 2013, 14:46

Hi, ich fange gerade an programmieren zu lernen mit der Lektüre "Python von Kopf bis Fuß". Ich habe schon am Ende des ersten Kapitels ein Problem :? , undzwar habe ich eine Liste in einer Liste in einer Liste erzeugt, um diese per Funktion zu "entschachteln".

Die Liste:

Code: Alles auswählen

filme=("Die Ritter der Kokosnuss", 1975, "Terry Jones& Terry Gilliam", 91,
	       ("Graham Chapman",("Michael Palin", "John Cleese")))
Die Funktion, die alles entschachteln soll

Code: Alles auswählen

def print_lvl(liste):
	for element in liste:
		if isinstance(element,list):
			print_lvl(element)
		else:
			print(element)
Und das was nach dem aufrufen der Funktion ausgegeben wird:

Code: Alles auswählen

Die Ritter der Kokosnuss
1975
Terry Jones& Terry Gilliam
91
('Graham Chapman', ('Michael Palin', 'John Cleese'))
Meine Frage ist, was habe ich falsch gemacht, obwohl ich jetzt alles abgeschrieben habe?

Danke im vorraus! :D -EvilOrange-

PS: Ich nutze die ILDE unter Ubuntu und Python 3.3.1 ...
weiß jemand wie die einleitenden Sätze in Ubuntu und Windows heißen? Also dieses #/etc/python ... zeug?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Naja, die Funktion ruft sich selbst auf, sobald sie ein Element entdeckt, welches eine Liste ist, um für eine weitere Stufe der Entschachtelung zu sorgen. Du verwendest aber Tupel. Dadurch gibt es keinen rekursiven Aufruf der Funktion, da der `isinstance()`-Test eben nur auf Listen, nicht aber auf Tupel prüft.
BlackJack

@EvilOrange: Der ``if``-Zweig wird niemals ausgeführt weil da auf den Datentyp `list` gerprüft wird, Du aber gar nicht wie behauptet verschachtelte Listen hast, sondern Tupel verwendest.
Benutzeravatar
EvilOrange
User
Beiträge: 2
Registriert: Freitag 10. Mai 2013, 14:46

ok, Danke euch!
... Das Buch hat mir leider nichts von Tupel erzählt, aber Google hat es mir jetzt beigebracht...
Und ich probier's gleich mal aus ob es funktioniert!

EDIT:
Vielen Dank Leute, mit tuple funktioniert es super! Code für eventuelle Nachfolger:

Code: Alles auswählen

def print_lvl(liste):
   for element in liste:
      if isinstance(element,tuple):
         print_lvl(element)
      else:
         print(element)
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

EvilOrange hat geschrieben: weiß jemand wie die einleitenden Sätze in Ubuntu und Windows heißen? Also dieses #/etc/python ... zeug?
Diese "einleitenden Sätze" nennt man Shebang. Unter Windows werden die ignoriert. Unter Linux sollte das i.d.R. /usr/bin/python sein, wobei das in vielen Distributionen (nehme an auch Ubuntu) auf Python 2 verweist. Willst du, dass das Script mit Python 3 aufgerufen wird, musst du das angeben (oder Arch verwenden ;) ) Mitunter sieht man auch "#!/usr/bin/env python", um Pfadunterschiede ausgleichen zu können.
Antworten