Variable in Variable einfügen

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
Dennis
User
Beiträge: 7
Registriert: Donnerstag 17. Mai 2007, 20:09

Hey,
nachdem das mit dem Anmelden endlich geklappt hat, komme ich hier mit einem Problem zu euch. Ich bin noch ziehmlicher Anfänger in Sachen Python, aber ein paar Sachen hab ich schon verstanden.

So, nun zu dem Problem :

Ich möchte als Übung einen Vokabeltrainer schreiben. Ich habe mir gedacht, dass ich die Vokabeln in ein Modul schreibe. Die Variabelen schreibe ich in eine Liste, die an eine Variable mit einem Lektionsnamen angehängt ist :

Code: Alles auswählen

#!/usr/bin/python/

lektion1 = ['amphitheatrum','basilica','curia']
lektion1uebersetzung = ['amphitheater','markthalle','rathaus']


lektion2 = ['hic','esse','populus']
lektion2uebersetzung = ['hier','sein','volk']
das wäre dann das Modul vok.py. Nun bin ich bei der Abfrage: Ich möchte, dass man zuerst die Lektion auswählen kann, und man dann zufällige Vokabeln daraus übersetzen muss. Um die Lektion auszuwählen hab ich mir gedacht, hänge ich die eine Eingabe einfach in den Namen des Lektionsnamen, welcher dann einfach nur die Nummer anhängt.

Hier die abfrage.py :

Code: Alles auswählen

#!/usr/bin/python/

import vok
import random

#Auswahl der Lektion

lektionsnummer = int(raw_input('Bitte geben sie die Nummer der Lektion ein, die sie testen wollen:'))

#Definieren der Variablen

maxwert = len(vok.lektion,lektionsnummer)
zufall = random.randrange (0,maxwert)
vokabel = vok.lektion,lektionsnummer[zufall]
befehl = 'Bitte geben sie die Uebersetzung von',vokabel,'ein:'

#Pruefen der Eingabe

eingabe = raw_input(befehl)
if eingabe == vok.lektion,lektionsnummeruebersetzung[zufall]:
	print 'Das war richtig'
else:
	print 'Das war leider falsch'
Ich denke nicht nur, ich bin mir sogar sicher :) , dass der Fehler hier liegt:

Code: Alles auswählen

maxwert = len(vok.lektion,lektionsnummer)
und hier :

Code: Alles auswählen

vokabel = vok.lektion,lektionsnummer[zufall]
und hier :

Code: Alles auswählen

if eingabe == vok.lektion,lektionsnummeruebersetzung[zufall]:
Ich hoffe ich habs verständlich erklärt und ihr könnt mir helfen,

MfG Denny
BlackJack

Jup, da hast Du fehlerhafte Zeilen gefunden. Das Komma trennt Argumente bei Funktionsaufrufen und erzeugt Tupel. Die `len()` Funktion nimmt aber nur ein Argument entgegen. Was eine entsprechende Fehlermeldung auch sagt.

Organisiere Deine Vokabeln doch so:

Code: Alles auswählen

lektion1 = [('amphitheatrum', 'amphitheater'),
            ('basilica', 'markthalle'),
            ('curia', 'rathaus')]

lektion2 = [('hic', 'hier'),
            ('esse', 'sein'),
            ('populus', 'volk')]

lektionen = [lektion1, lektion2]
So stehen die zusammgehörigen Vokabeln in einem Tupel. Das ist übersichtlicher und einfacher zu erweitert oder verändern.

Die Lektionen stehen in `lektionen` und man kann per Index darauf zugreifen.

Mit `random.choice()` kannst Du Dir das Leben übrigens ein wenig einfacher machen.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Wäre nicht grade für sowas ein dict, also ein Wörterbuch, besser geeignet? Dann kann man aus der key-Liste einen auswählen, diesen abfragen und dann leicht abfragen.
Bei einer verschachtelten Liste hat man immer 2 Indexe und je nach Erweierungspotential wird das recht umständlich und kompliziert...
Man hat dann auch nur einen Schlüssel und nicth beide Wörter, wobei das wohl in solcher Dimension nichts machen würde...
BlackJack

Nur weil man "Dictionary" mit "Wörterbuch" übersetzen kann, ist das IMHO nicht unbedingt die geeignetere Datenstruktur. Bei einem Vokabeltrainer benötigt man sowieso immer beide Werte. Und das "aus der key-Liste einen auswählen" ist umständlich weil es so eine Liste nicht gibt. Die wird bei `dict.keys()` erst beim Aufruf erstellt. Also wird die entweder bei jedem Auswählen auf's neue erstellt, oder man muss die Liste als zusätzliche Datenstruktur neben dem Dictionary verwalten.

Und die zwei Indexe sehe ich nicht wirklich. Man braucht letztendlich nur einen, nämlich um die Lektion auszuwählen. Bei der Lektion selbst kann man entweder immer Elemente mit `random.choice()` auswählen oder die Vokabeln mischen (`random.shuffle()`) und in einer Schleife drüberlaufen. Einen expliziten Index braucht man dafür nicht.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

ok, bei einem so kleinen Programm mit einem solchen Aufbau hast du Recht, aber ich hatte jetzt schon daran gedacht, dass man das Programm erweitern kann, wenn man zB richtige entfernen oder falsche bearbeiten will. Dann muss man nämlich aufwändig mit Indexen Arbeiten und diese evtl. sogar erst mit .index() finden und so...
Außerdem könnte man an einem so einfachen Programm das dict-Prinzip lernen und Vor- und Nachteile erkennen. Weil wenn mans nicht kennt, nimmt mans auch nicht, wenn es besser geeignet wäre als verschachtelte Listen. :wink:
BlackJack

Falls Du meinst, dass man Worte beim Abfragen falsch übersetzt wurden, nochmal abfragen will, dann braucht man auch keine Indexzugriffe. Man muss in der Abfrageschleife einfach nur eine Liste mit den falsch übersetzten Vokabeln sammeln. Ungetestet:

Code: Alles auswählen

def abfragen(vokabeln):
    vokabeln = list(vokabeln)
    while vokabeln:
        falsch = list()
        random.shuffle(vokabeln)
        for vokabel in vokabeln:
            sprache_a, sprache_b = vokabel
            uebersetzung = raw_input('Uebersetzen: %s => ' % sprache_a)
            if uebersetzung == sprache_b:
                print 'Richtig!'
            else:
                print 'Falsch!'
                print '%s waere richtig gewesen.' % sprache_b
                falsch.append(vokabel)
        vokabeln = falsch
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

:evil: Ich gebs auf. Ich nenn ein Bsp. und du minimalisierst es und sagst, wies mit verschachtelten Listen geht...Es geht nicht darum, dass es nicht geht, sondern dass es unter Umständen bei Anwendungen, die aus mehr als einer Funktion bestehen, einfacher sein könnte, mit dicts zu arbeiten, und was "stilmäßig" besser ist uns so...
naja, ich start jetzt keinen neunen Thread "dict oder list?"

Tschö, jj
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Kein Streit hier bitte ;-)

sehts dochmal so dict oder tupel ist egal, aber das sinnfollste ist das auszulagern in eine datenbank oder eine .ini datei mit hilfe von dem modul ``ConfigParser`` welches ich über alles liebe ;-)

den der einsatzfall schreit nach ini:

Code: Alles auswählen

[lektion1]
wort1 = word1
wort2 = word2

[lektion2]
usw...
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Ist jetzt auch nicht grad das einfachste...könnt man, wenn man ein größeres Prjekt plant oder den Umgang mit dieser Möglichkeit der Speicherung zu lernen, so machen. Das hat nur nicht direkt was hiermit zu tun, weil was macht du mit den Daten, wenn du sie eingelesen hast? Speicherst du die Datenstruktur als Dict, List, oder liest du immer wieder neu?
...viele Wege fürn zu "Rom <-> Hauptstadt von Italien" :lol:
Gruß, jj
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Hm, rein von der Intuition her würde ich ja auch Dicts verwenden. Ob das sinnvoll ist fragt sich aber/stellt sich dann heraus. Ein Problem was ich sehe ist zum Beispiel das die Keys in einem Dict nicht sortiert sind. Ich denke es ist nicht so weit her geholt dass man die Wörter in einer Lektion in einer bestimmten Reihenfolge haben will.

Gruss,
Jonas
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

veers hat geschrieben:Ich denke es ist nicht so weit her geholt dass man die Wörter in einer Lektion in einer bestimmten Reihenfolge haben will.
Das ist ein Punkt. Ich könnt jetzt sagen, dass man dann halt noch ne Liste mit den Keys in der richtigen Reihenfolge als Extraitem ins dict packt oder so dazulegt, aber das wär echt umständlich.
Ich würd aber viel mehr sagen, dass man die Vokabeln in jeder Reihenfolge können sollte. :wink:
Wenn Reihenfolge, dann doch eher erst die schon mal falsch beantworteten und dann die anderen, oder?
Gruß, jj
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

schlangenbeschwörer hat geschrieben:Wenn Reihenfolge, dann doch eher erst die schon mal falsch beantworteten und dann die anderen, oder?
Tendenziell, ja. Ich vermute aber mal das es auch nicht gut ist wenn ein falsches Wort sich zu früh wiederholt, da die Antwort sonst einfach aus dem Kurzzeit Gedächtnis kommt.

Aber hey, ich bin weder Neurologe noch Didaktiker, und ich will es eigentlich auch nicht werden ;)
Antworten