Listenausgabe

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
Hetiras
User
Beiträge: 7
Registriert: Mittwoch 5. Februar 2014, 15:08

Hallo Leute,
bin noch recht neu in Python.

Ich habe eine Liste, deren Einträge ich jeweils in einer neuen Zeile ausgeben will.

Bei der Ausgabe sieht das Ganze dann so aus :

Bild

Mein Code zur Ausgabe :

Code: Alles auswählen

        for i in range(0,len(Liste)):
            print('')
            print('Name : ',Liste[i][0],'Vorname : ',Liste[i][1],'Alter : ',Liste[i][2],'Wohnort : ',Liste[i][3])
Dazu habe ich zwei Fragen.

Wie kann ich die Inhalte der Liste ohne diese [ ' ' ] ausgeben?
Wie kann ich erreichen, dass die Kategorien wie im Bild zu sehen : Name, Vorname, Alter und Wohnort untereinander stehen damit es übersichtlicher wird?

Danke schon mal für eure Antworten.
BlackJack

@Hetiras: Du hast dort offensichtlich jedes Element noch mal in einer extra Liste stehen. Das würde ich nicht an dieser Stelle lösen, sondern an der Stelle wo die Daten in dieser komischen Form erstellt werden.

``for i in range(len(sequence)):`` ist in Python ein „anti pattern”. Du kannst doch *direkt* über die Elemente der Liste iterieren, ohne den Umweg über einen Index.

Warum stecken denn in der Liste weitere Listen? Listen bei denen die einzelnen Elemente unterschiedliche Bedeutungen haben führen zu unübersichtlichen Programmen voller ”magischer” Indexzahlen deren Bedeutung man sich merken muss. Hier würden sich doch zum Beispiel Wörterbücher (`dict`) für die einzelnen Elemente der äusseren Liste anbieten, mit Schlüsseln die Aussagekräftiger sind als 1, 2, oder 3.

Der Name `Liste` ist viel zu generisch. Namen sollten nicht den Typ sondern die Bedeutung vermitteln. Hier also so etwas wie `personen`.
Hetiras
User
Beiträge: 7
Registriert: Mittwoch 5. Februar 2014, 15:08

Danke für die Antwort hat mir sehr geholfen.

Hab jetzt ein weiteres Problem.

Ich möchte, dass eine Liste ("Datenbank") in einer Textdatei gespeichert wird.

Code: Alles auswählen

def Speichern():
    datei = open("Datenbank.txt", "w")
    datei.write(str(Datenbank))
    datei.close

def Lesen():
    datei = open("Datenbank.txt", "r")
    for line in datei:
        a = line  
    return a

Datenbank = Lesen()
Nun habe ich folgendes Problem :

Beim abspeichern muss die Liste in str umgewandelt werden un beim Öffnen ist die Liste ("Datenbank") keine Liste mehr, sondern str.
Wie kann ich dieses Problem lösen, bzw. gibt es eine andere Möglichkeit das zu lösen?
BlackJack

@Hetiras: Am einfachsten dürfte das `json`-Modul aus der Standardbibliothek sein. Man sollte nicht ohne Not neue Dateiformate selber erfinden.

Bezüglich der Namensschreibweisen könntest Du mal einen Blick in den Style Guide for Python Code werfen. Und man sollte in Funktionen nur auf Werte zugreifen die als Argumente übergeben wurden. Ausgenommen Konstanten. Sonst werden Programme sehr schnell sehr unübersichtlich.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dateien solltest Du auch immer mit dem ``with open(...) as f`` Idiom öffnen. Damit wird das Dateiobjekt auf jeden Fall geschlossen. Aktuell bleiben die bei Dir immer offen ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hetiras hat geschrieben:Wie kann ich erreichen, dass die Kategorien wie im Bild zu sehen : Name, Vorname, Alter und Wohnort untereinander stehen damit es übersichtlicher wird?
Dazu könntest Du auch mal in snafu's columnizer reinschauen...

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@mutetella: Es ist wohl eher eine tabellenartige Ausgabe gewünscht - also mit fester Zuordnung von Kategorie->Wert. `shcol` konzentriert sich aber darauf, viele Strings ohne weitere Zuordung möglichst übersichtlich darzustellen. Das können etwa Dateinamen eines Ordners sein oder die Auflistung aller Hauptstädte Europas. Sobald die Daten aber eine Struktur besitzen (für übliche Tabellenformate z.B. meist zweidimensionale Listen), sind andere Tools wie prettytable oder tabulate die deutlich bessere Alternative.

Und im hier vorliegenden Fall kann man das wahrscheinlich sogar händisch lösen mit etwas wie:

Code: Alles auswählen

'{}\t{}'.format(elem[0], elem[1])
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich habe mich jetzt doch entschieden, zumindest für 1:1-Mappings eine entsprechende Formatierung anzubieten. Anwendungsbeispiel:

Code: Alles auswählen

>>> import shcol
>>> data = [('Name', 'Wurst'), ('Vorname', 'Hans'), ('Strasse', 'Wurstweg 15'), ('Ort', '12345 Wurstheim')]
>>> shcol.print_columnized_mapping(data, spacing=5)
Name        Wurst
Vorname     Hans
Strasse     Wurstweg 15
Ort         12345 Wurstheim
Momentan wird bei der Spezialbehandlung für eine vorliegende Mapping-Struktur noch der Parameter zur Festlegung der maximalen Zeilenbreite ignoriert und auch ansonsten sind ein paar Umstellungen des neuen Codes im `core`-Modul nicht unwahrscheinlich. Zudem fehlen noch Tests und die entsprechend zusätzliche Dokumentation. Das reiche ich in Kürze nach.

Danke jedenfalls an mutetella für den wohl eher unabsichtlich gegebenen Tipp für diese Verbesserung. ;)
Antworten