einzelne Elemente einer Liste anzeigen

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
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Hallo,
ich versuche gerade ein Programm zu schreiben. Zuerst gebe ich 4 Mannschaftsnamen ein, dann schreibe ich sie in ein File und lese das File wieder aus. Es funktioniert alles bis zur Zeile

Code: Alles auswählen

print ((liste_vereinsnamen),("*********************"))
.

Code: Alles auswählen

 -*-coding: utf8 -*-
# vergebene Variablen: i, nn
# vergebene Wörter: Mannschaft, list_evereinsnamen
# vergebene Files: file_Mannschaftsnamen
#
# nn: Anzahl der Mannschaften der Tabelle
nn=4
# i: Zählvariable
i=1
# erzeugen leere liste "liste_vereinsnamen"
liste_vereinsnamen=[]
for i in range (1,nn+1):
    # Umwandlung von String in Integer
    i=str(i)
    print (type(i))
    # Eingabe der Mannschaften
    mannschaft=input("Gebe den Namen der "+(i)+". Mannschaft ein: ")
    print(mannschaft)
    print (type(mannschaft))
    print(i)
    print (type (i))
    print (mannschaft)
    # Ausgabe der Mannschaften auf dem Bildschirm
    print ("Die",(i)+". Mannschaft ist", mannschaft)
    # Erzeugen der Datei Mannschaftsnamen
    print((i)+("=i"))
    print(type (i),("=Type von i"))
    # An die Liste vereinsnamen wird die nächste Mannschaft angehängt      
    liste_vereinsnamen.append(mannschaft)
    print ("Mannschaft ist "+mannschaft)
    # liste_vereinsnamen wird angezeigt
    print ((liste_vereinsnamen),("=liste_vereinsnamen"))
    print ("Leerzeile")
# file_Mannschaftsnamen wird erzeugt
file_Mannschaftsnamen=open("Mannschaftsnamen.txt","w")
file_Mannschaftsnamen.write(str(liste_vereinsnamen))
# file_Mannschaftsnamen wird geschlossen
file_Mannschaftsnamen.close()
print (liste_vereinsnamen)
#print ("Hier wird die leere liste_vereinsnamen angezeigt")
#print (liste_vereinsnamen)
#print ("Hier wird die leere liste_vereinsnamen angezeigt")
# file_Mannschaftsnamen wird geöffnet und gelesen
file_Mannschaftsnamen=open("Mannschaftsnamen.txt","r")
# file_Mannschaftsnamen wird geschlossen
file_Mannschaftsnamen.close()
# liste_vereinsnamen wird angezeigt
print ("Mannschaftsnamen aus file")
print ((liste_vereinsnamen),("*********************"))
for liste_vereinsnamen in range (1,nn+1):
    print (i)
    print (liste_vereinsnamen)
    print [i]
    print (mannschaft)
Dann möchte ich innerhalb einer for-Schleife die Liste "zerschneiden" und jeden Mannschaftsnamen einzeln anzeigen lassen. Leider klappt das nicht. Es erscheint folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\pc\Desktop\Python Programme\Teilprogramm Eingabe der Mannschaften.py", line 53, in <module>
    print [i]
TypeError: 'builtin_function_or_method' object is not subscriptable
Wer kann mir weiterhelfen? Was mache ich falsch?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

print ist eine Funktion. Die ruft man, so wie du das an anderer Stelle auch schon tust, mit runden Klammern auf. Da einfach eckige zu nehmen geht eben nicht.

Ich vermute mal du willst sowas:

Code: Alles auswählen

mannschaft = liste_vereinsnamen[i]
print(mannschaft)
Wobei dann der naechste Fehler natuerlich vorprogrammiert ist: i muss von 0 - laenge - 1 laufen, sonst krachts. Was du also wirklich machen willst ist

Code: Alles auswählen

for nummer, mannschaft in enumerate(liste_vereinsnamen, start=1):
     print(i, mannschaft)
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Habe meinen Code jetzt so geändert:

Code: Alles auswählen

print ((liste_vereinsnamen),("*********************"))
for liste_vereinsnamen in range (1,nn+1):
    mannschaft = liste_vereinsnamen[i]
    print(mannschaft)
Jetz kommt folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\pc\Desktop\Python Programme\Teilprogramm Eingabe der Mannschaften.py", line 51, in <module>
    mannschaft = liste_vereinsnamen[i]
TypeError: 'int' object is not subscriptable
Was ist falsch?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Es mag für Dich ganz nützlich sein, über jeden Typ Bescheid zu wissen, mir macht das aber das Lesen des Codes sehr schwer, weil ich erst allen unnötigen Ballast löschen mußt.
`i=1` ist unnötig, da es nicht verwendet wird. Wenn `nn` `anzahl_mannschaften` heißt, braucht man das nicht mit einem Kommentar erklären. Datentypen sollten nicht in Variablennamen vorkommen: liste_vereinsnamen -> vereinsnamen.
Man benutzt format-Strings, dann braucht man i auch nicht extra in einen String wandeln.
Dateien öffnet man mit dem with-Statement; die Stringrepräsentation einer Liste ist nicht für die Speicherung, sondern nur zu Debugzwecken gedacht.

Code: Alles auswählen

anzahl_mannschaften = 4
vereinsnamen = []
for i in range(1, anzahl_mannschaften + 1):
    mannschaft = input(f"Gebe den Namen der {i}. Mannschaft ein: ")
    print (f"Die {i}. Mannschaft ist {mannschaft}")
    vereinsnamen.append(mannschaft)

with open("Mannschaftsnamen.txt", "w") as output:
    for mannschaft in vereinsnamen:
        output.write(f"{mannschaft}\n")

# und wieder laden:
vereinsnamen = []
with open("Mannschaftsnamen.txt") as lines:
    for line in lines:
        vereinsnamen.append(line.rstrip())
EDIT: zu Deinem letzen Beitrag: jetzt benutzt Du `liste_vereinsnamen` als Laufvariable über eine Zahl. Die ist natürlich keine Liste mehr. In Python benutzt man ganz selten explizit einen Index, sondern iteriert direkt über die Listelemente.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ergänzend: Textdateien sollte man explizit mit einer Kodierung öffnen damit das Programm in jeder Umgebung die gleiche Kodierung verwendet. UTF-8 bietet sich als Kodierung an, weil damit alle Unicode-Zeichen kodiert werden können.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Hallo Sirius 3,
habe meinen Code jetzt so geändert:

Code: Alles auswählen

# -*-coding: utf8 -*-

anzahl_mannschaften=4

vereinsnamen=[]
for i in range (1, anzahl_mannschaften+1):
    mannschaft = input(f"Gebe den Namen der {i}. Mannschaft ein: ")
    print (f"Die {i}. Mannschaft ist {mannschaft}")
    vereinsnamen.append(mannschaft)
    print(i)
    print (type (i))
    print (mannschaft)
    # liste_vereinsnamen wird angezeigt
    print ((vereinsnamen),("vereinsnamen"))
    print ("Leerzeile")
    
# file_Mannschaftsnamen wird erzeugt
with open("Mannschaftsnamen.txt", "w") as output:
    for mannschaft in vereinsnamen:
        output.write(f"{mannschaft}\n")

print (vereinsnamen)

# und wieder laden:
vereinsnamen = []
with open("Mannschaftsnamen.txt") as lines:
    for line in lines:
        vereinsnamen.append(line.rstrip())

print ("End")
Es funktioniert alles. Nur möchte ich noch jede der 4 Mannschaften in einer Zeile nach dem laden anzeigen lassen. Wie geht das?

Wie ist der Befehlt in Python für "clear screen"?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Es gibt kein ›clear screen‹, weil es sich um ein Konsolenprogramm handelt und nicht um eine Text-UI.
Wenn Du es anzeigen lassen willst, dann mach das doch einfach, mit einer Schleife.
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Ich lasse das mit dem "cls"

Ich möchte heute nur noch wissen, wie ich die 4 Mannschaften einzeln untereinander anzeigen lassen kann:

Frankfurt
Wolfsburg
Dortmund
Gladbach
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Mit welchem Tutorial lernst Du denn Python, wo nicht erklärt wird, wie man eine for-Schleife benutzt?
Benutzeravatar
Bill987654321
User
Beiträge: 136
Registriert: Sonntag 8. März 2020, 10:56

Ich habe das Buch "Python 3" von Ernesti/Kaiser und 2 Anfängerbücher. Außerdem benutze ich verschiedene Tutorials. Ich habe (auch) die Kapitel über die "for-Schleife" gelesen und auch Tutorials dazu angeschaut. Weil ich Anfänger bin, bleibe ich trotzdem immer wieder an "einfachen" Sachen hängen.
Das mit der geschweiften Klammer habe ich auch gelesen, weiß grob, was das bedeutet, muss aber trotzdem noch mal nachschlagen. Was das "f" bedeutet muss ich auch noch mal nachschlagen.
Könntest du mir für heute nur noch den Code schreiben, wie ich die 4 Mannschaften unteteinander ausgeben kann?

Das Programm soll dann so weitergehen:
Man soll je 2 Mannschaften auswählen, die gegeneinander spielen und das jeweilige Ergebnis eingeben. Dann soll Python die neue Tabelle berechnen und in ein File schreiben. Wenn das nächste/die nächsten Spiel/Spiele sind, soll die gespeicherte Tabelle geladen werden, die neuen Ergebnisse eingegeben und "aufaddiert" werden und wieder die Tabelle abgespeichert werden. Das bis zum letzten Speiltag.
Für mich als Anfänger wäre die Krönung, eine "Tabellenplatzverlaufskurve" zu programmieren. Ich denke, du weißt, was ich meine, oder?

Wenn das alles funktioniert möchte ich das Programm über tkinter laufen lassen.

Vielen Dank für die Hilfe :D
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bill987654321: Bis `tkinter` scheint mir noch ein ziemlicher Weg zu sein wenn man ``for``-Schleifen noch nicht drauf hat. Dazwischen liegen noch Funktionen – das sollte nicht alles auf Modulebene stehen sondern sinnvoll auf Funktionen verteilt — und objektorientierte Programmierung, denn das braucht man für jede nicht-triviale GUI. Und wenn man OOP nicht vor GUI lernt, muss man beides zusammen lernen, denn bei GUIs kommt dann noch dazu das die GUI-Hauptschleife den Programmablauf koordiniert und man das nicht mehr so schön linear selbst in der Hand hat.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten