Seite 1 von 1
auf liste in liste zugreifen
Verfasst: Samstag 29. Dezember 2012, 21:51
von misterjosu
hallo,
ich versuche jetzt schon eine weile auf eine liste in einer liste zuzugreifen aber ich bekomme immer eine fehlermeldung. ich verstehe aber nicht warum.( # 1 )
Skript:
Code: Alles auswählen
raw_txt = open("voc.txt",'r')
txt = raw_txt.read()
raw_voc = txt.splitlines()
print(raw_voc)
anzahl = len(raw_voc)
if not(anzahl % 2 == 0):
print("ungerade zahl")
anzahl -= 1 # Letztes wort entfernen
voc_1 = 0
voc_2 = 1
vokabeln = []
# Werden zu listen "gepackt"
while not(anzahl == 0):
vokabeln += [[raw_voc[voc_1],raw_voc[voc_2]]]
voc_1 += 2
voc_2 += 2
anzahl-= 2
print (vokabeln[1])
print ("---")
print (vokabeln[1[1]]) # 1 ( Versuch auf liste in liste zuzugreifen )
Re: auf liste in liste zugreifen
Verfasst: Samstag 29. Dezember 2012, 21:54
von jbs
Du versuchst auf das erste Element von 1 zuzugreifen. Zweidimensionale zugriffe gehen so:
Re: auf liste in liste zugreifen
Verfasst: Samstag 29. Dezember 2012, 22:01
von Hyperion
Davon abgesehen sieht Dein Code ziemlich umständlich aus. Kann es sein, dass Du die Vokabeln untereinader weg speicherst? Also folgendernaßen:
Wie Du selber merkst, ist das Parsen dieser Serialisierung umständlich!
Wieso greifst Du nicht auf ein Standardformat wie JSON, CSV, XML o.ä. zurück? Dafür gibt es fertige Parser in Python und das Einlesen in eine interne Datenstruktur gestaltet sich um ein vielfaches leichter, robuster und besser zu lesen.
Wobei Du Dir vermutlich eh erst einmal "Sorgen" um die interne Repräsentation der Vokabeln machen solltest. Die Persistenz würde ich erst später angehen.
Re: auf liste in liste zugreifen
Verfasst: Samstag 29. Dezember 2012, 22:09
von misterjosu
Ja , da hast du recht ich speichere meine vokabeln untereinander. ich bin anfänger und wusste nicht wie ich das sonst hinbekommen soll.
wie das gemeint ist mit dem untereinander verstehe ich noch tnicht ich speichere das ja in einer liste nicht in einer tabelle.
wie kann ich jetztauf das element zugreifen ?
Re: auf liste in liste zugreifen
Verfasst: Samstag 29. Dezember 2012, 22:22
von misterjosu
@jbs
Danke !
habs gerade erst verstanden und jetzt klappt das
mit
Re: auf liste in liste zugreifen
Verfasst: Samstag 29. Dezember 2012, 23:19
von Sirius3
@misterjosu: einige Anmerkungen
not(x==0) schreibt man normalerweise als x!=0
Dateien öffnet man mit with:
Code: Alles auswählen
with open("voc.txt") as raw_txt:
txt = raw_txt.readlines()
An Listen hängt man Elemente mit append:
Alle Deine Vokabeln haben noch den Zeilenumbruch aus raw_txt, den man
am Besten mit strip entfernen.
Alles in Allem kann es in Python so aussehen:
Code: Alles auswählen
with open("voc.txt") as raw_txt:
line_iterator = iter(line.strip() for line in raw_txt)
vokabeln = zip(line_iterator,line_iterator)
print(vokabeln[0][0])
Grüße
Sirius
Re: auf liste in liste zugreifen
Verfasst: Sonntag 30. Dezember 2012, 13:06
von Hyperion
misterjosu hat geschrieben:Ja , da hast du recht ich speichere meine vokabeln untereinander. ich bin anfänger und wusste nicht wie ich das sonst hinbekommen soll.
Hast Du denn schon den "Rest", also Dein eigentliches Vokabelprogramm fertig? Aufgrund Deiner Unkenntnis vom Indexzugriff vermute ich mal eher nein. Daher stelle ich erneut die Frage, wieso Du Dich zu Beginn mit der Persistenz befasst?
Schaffe doch erst einmal die Datenmodelle und Funktionalität für den Kern des Problems! Dabei müssen Vokabeln vermutlich im Speicher als Datenstruktur abgebildet werden und dann Operationen auf diesen stattfinden, wie das simple Abfragen einer Übersetzung usw.
Wenn Du das so weit hinbekommen hast, dann mache Dir Gedanken darüber, wie Du die Vokabeln dauerhaft speicherst. Vermutlich kann man dann auch einen viel eleganteren Weg finden, als den bisher eingeschlagenen.
Ich würde Dir z.B. mal empfehlen,
diesen Thread durchzulesen. Ersetze dabei zu Beginn das Wort "GUI" durch "Persistenz" - ansonsten versuche die vorgeschlagene Methodik anzunehmen

Re: auf liste in liste zugreifen
Verfasst: Sonntag 30. Dezember 2012, 13:55
von misterjosu
Ok, der weg der mir oben gezeigt wird sieht ja schon mal viel eleganter aus, aber wie schon gesagt ich wusste nicht wie ich es sonst machen soll.
das vokabelpogramm an sich gibt es noch nichtaber wenn ich mal so ganz grob was habe poste ich es mal dankönnt ihr mir ja sagen was ichda wieder unnötig kompliziert mache.
PS: ich lerne python jetzt so ca. 2 Monate aber eben nicht so intensiv. das ganze mache ich mit dem buch "mitd" von michaelweigend, und ich lese nicht alles der reihe nachweil ich das ganze auch anwenden will und nicht nur rohre Theorie kauen will.
Ich habe schon etwas leichtere dinge geschrieben z.B. :Zahlenraten
Code: Alles auswählen
# Zahlenraten mit GUI
# Von misterjosu
# 20.12.12
import time
import random
from tkinter import *
Eingabe = -1
Random = random.randint(0,100)
start_time = time.time()
print(Random)
def Raten():
""" Alg. Raten:
- Zahl = Random ?
- false = zu groß / klein )
- true = Ende
"""
Eingabe = int(fenster.input.get())
if not (Eingabe == Random):
if (Eingabe < Random):
fenster.info.config(text = " zu klein ")
else:
fenster.info.config(text = " zu groß ")
elif (Eingabe == Random):
end_time = time.time()
need = end_time - start_time
fenster.info.config(text =" Du hast die zahl "+(str(Random))+" in "+(str(int(need)))+ "Sekunden Erraten !")
fenster = Tk()
fenster.Line1 = Label(text = " Zahlenraten_Version_0.1_Pre-Alpha " )
fenster.input = Entry()
fenster.info = Label(text ="------")
fenster.check = Button(text = " RATEN ",
command = Raten,)
fenster.Line1.pack(side =TOP, fill =Y)
fenster.input.pack(padx =10,fill =X)
fenster.info.pack()
fenster.check.pack()
fenster.mainloop()
Re: auf liste in liste zugreifen
Verfasst: Sonntag 30. Dezember 2012, 15:01
von Sirius3
@misterjosu: noch ein paar Tipps:
Um Bedingungen braucht man normalerweise keine Klammern, und
statt der gegenteiligen Bedingung in Deinem elif reicht ein else.
Variable Strings sollten nie mit + aneinandergesetzt werden. Verwende
stattdessen format.
Code: Alles auswählen
if Eingabe!=Random:
if Eingabe<Random:
fenster.info.config(text=" zu klein ")
else:
fenster.info.config(text=" zu groß ")
else:
end_time = time.time()
need = end_time - start_time
fenster.info.config(text="Du hast die Zahl {0:i} in {1:.0f} Sekunden erraten!".format(Random,need))
Edit: Einrückung korrigiert (s.u.)

Re: auf liste in liste zugreifen
Verfasst: Sonntag 30. Dezember 2012, 17:49
von Hyperion
@Sirius3: Deine Einrückungen stimmen so nicht
@misterjosu: Für neue Themen starte doch bitte einen neuen Thread. Dein zu letzt geposteter Code hat keinen Bezug mehr zum Thema des Threads. Wenn Du dafür ein Review willst, dann eröffne dafür in Zukunft einen eigenen Thread.
Generell ließe sich dazu noch einiges sagen... ich würde Dir dringend empfehlen, die Finger von GUIs zu lassen und Dir mal
PEP8 anzugucken. Alleine die äußere Form des Codes ist schon unschön.