auf liste in liste zugreifen

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
misterjosu
User
Beiträge: 44
Registriert: Samstag 29. Dezember 2012, 21:40

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 )





Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Du versuchst auf das erste Element von 1 zuzugreifen. Zweidimensionale zugriffe gehen so:

Code: Alles auswählen

matrix[row][column]
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Davon abgesehen sieht Dein Code ziemlich umständlich aus. Kann es sein, dass Du die Vokabeln untereinader weg speicherst? Also folgendernaßen:

Code: Alles auswählen

Sprache
language
Wort
word
...
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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
misterjosu
User
Beiträge: 44
Registriert: Samstag 29. Dezember 2012, 21:40

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 ?
misterjosu
User
Beiträge: 44
Registriert: Samstag 29. Dezember 2012, 21:40

@jbs

Danke !

habs gerade erst verstanden und jetzt klappt das

mit

Code: Alles auswählen

print(vokabeln[1][1])
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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:

Code: Alles auswählen

    vokabeln.append([raw_voc[voc_1],raw_voc[voc_2]])
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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
misterjosu
User
Beiträge: 44
Registriert: Samstag 29. Dezember 2012, 21:40

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()
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.) :oops:
Zuletzt geändert von Sirius3 am Sonntag 30. Dezember 2012, 18:11, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten