Finde Fehler nicht (Französischer Abfrager)

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.
Magnetonstar
User
Beiträge: 14
Registriert: Montag 16. November 2015, 18:46

Hallo,

Ich hatte vor etwa 6 Tagen angefangen, Python zu lernen. Ich habe mich dann selbst versucht im programmieren und habe einen 'Französischen Abfrager' programmiert (nichts grosses, sind nur drei Wörter). Dieses Programm soll mich mit französischen Wörter abfragen. Bisher hat auch alles funktioniert. Hab bei jedem Wort die richtige Antwort erhalten. Doch aus irgendeinen Grund, funktioniert EIN einziges Wort nicht: Ich hab insgesamt drei Wörter (die Blume[la fleur], die Wiese[le pré], der Stein[la pierre]). Wenn ich dann von dem Programm nach 'Die Blume' abgefragt werde, und ich gebe fälschlicherweise 'le pré' ein, stürtzt die Konsole ab, anstatt mir zu sagen, das es falsch sei. Deswegen bitte ich euch um Hilfe!
Ich glaube, ich habe dieses Problem, seit ich die Funktion 'auflister' geschrieben habe.

Code: Alles auswählen

import random

d_list = ["die Blume ", "die Wiese ", "der Stein "] #Deutsche Liste, auf das 'anz' mithilfe der Funktion 'zufall_g' zugreift.

d_f_words = {
	'die Blume ': 'la fleur',
	'der Stein ': 'la pierre', #Dict. auf das die Funktion 'korrigierer' zugreift
	'die Wiese ': 'le pré'
}

verzeichniss_2 = {
	'eingabe_1': [], #Mithilfe der Funktion 'in_put' Wird das französische geschriebene Wort, dass der Benutzer eingegeben hat, hier gesspeichert.
	'eingabe_2': []
}

anz = {
	'anz_1' : [verzeichniss_2['eingabe_1']],
	'anz_2' : [verzeichniss_2['eingabe_2']] #'anz' steht für Anzeige. Das deutsche Wort wird dann mit der Funktion 'erneuer' zur Liste hinzugefügt.
}

def zufall_g(listo):
	anzo = random.choice(listo) #Diese Funktion bestimmt ein zufälliges Wort aus einer Liste.
	return anzo

def korrigierer(eingabe):
	for x in d_f_words:
		if x == eingabe[0]:
			y = d_f_words[x]
			if eingabe[1] == y:
				d_list.remove(eingabe[0]) #Diese Funktion prüft das eingetippte Wort (eingabe) auf die Richtigkeit. Das gebrauchte Wort wird dann aus der Liste entfernt, dass es nicht wiederverwendet wird.
				return "Richtig"
			else:
				d_list.remove(eingabe[0])
				return "Falsch, " + y + " wäre die richtige Antwort gewesen"

def erneuer(anzi):
	z = zufall_g(d_list)
	anzi.append(z)
	for s in verzeichniss_2:
		if anzi[0] == verzeichniss_2[s]: #Diese Funktion fügt dem Dict. 'anz' das zufällige Wort hinzu. Das wird dann auch dem Dict. 'verzeiniss_2' hinzugefügt.
			verzeichniss_2[s].append(anzi[1])

def in_put(anz):
	word = input(anz[1])
	for x in verzeichniss_2:
		if verzeichniss_2[x] == anz[0]: #Hier gibt man das französische Wort ein, was dann dem verzeichniss_2 hinzugefügt wird und schlussendlich die Funktion 'korrigierer' verwendet.
			verzeichniss_2[x].append(word)
			print(korrigierer(verzeichniss_2[x]))

def auflister(anz):
	erneuer(anz)
	in_put(anz) # Diese Funktion verwenden eigentlich einfach nur zwei andere Funktionen (erneuer und in_put).


a_1 = auflister(anz['anz_1']) #Das ist Aufgabe ei.ns

a_2 = auflister(anz['anz_2']) #Das ist Aufgabe zwei.




a = input("Drücke eine Taste zum Beenden")
Zuletzt geändert von Magnetonstar am Montag 16. November 2015, 19:44, insgesamt 1-mal geändert.
Benutzeravatar
noisefloor
User
Beiträge: 4253
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ist das der ganze Code? Da fehlt doch der Teil, wo der Nutzer überhaupt was eingeben kann...

Ansonsten könnte man da viele vereinfachen / besser machen - aber das was ja nicht die Frage ;-)

Gruß, noisefloor
Magnetonstar
User
Beiträge: 14
Registriert: Montag 16. November 2015, 18:46

noisefloor hat geschrieben:Hallo,

ist das der ganze Code? Da fehlt doch der Teil, wo der Nutzer überhaupt was eingeben kann...

Ansonsten könnte man da viele vereinfachen / besser machen - aber das was ja nicht die Frage ;-)

Gruß, noisefloor
Ja natürlich, bei der Funktion in_put

Code: Alles auswählen

def in_put(anz):
    word = input(anz[1]) # <---- Da
    for x in verzeichniss_2:
        if verzeichniss_2[x] == anz[0]: #Hier gibt man das französische Wort ein, was dann dem verzeichniss_2 hinzugefügt wird und schlussendlich die Funktion 'korrigierer' verwendet.
            verzeichniss_2[x].append(word)
            print(korrigierer(verzeichniss_2[x]))
Edit: Hab herausgefunden dass der Fehler nur auftritt, wenn das erste Wort 'die Blume' ist. Ich werde ja insgesamt 2 mal abgefragt. Wenn 'die Blume' das zweite Wort ist, und ich gebe 'le pré' ein, dann funkt. es und zeigt mir, dass es falsch ist.

Nun kapiere ich es überhaupt nicht mehr.
Zuletzt geändert von Magnetonstar am Montag 16. November 2015, 19:57, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Magnetonstar: als erstes solltest Du sinnvolle Variablennamen wählen, die auch etwas aussagen, also keine verstümmelnden Abkürzungen "d", "f", keine generischen Begriffe "verzeichnis"/"eingabe", keine blödsinnigen Nummern "_2" und wenn Du anfängst, Schlüssel durchzunummerieren, willsts Du wahrscheinlich eher eine Liste benutzen.

Zweitens, starte Dein Programm mal aus der Eingabeaufforderung raus, dann siehst Du auch den Fehler, den Du hier, bei Bedarf auch posten sollst, sonst müssen wir raten, wo denn was falsch läuft. Dann kannst Du ach die unsinnige letzte Zeile ("Taste drücken") löschen.
Magnetonstar
User
Beiträge: 14
Registriert: Montag 16. November 2015, 18:46

Sirius3 hat geschrieben:@
Zweitens, starte Dein Programm mal aus der Eingabeaufforderung raus, dann siehst Du auch den Fehler, den Du hier, bei Bedarf auch posten sollst, sonst müssen wir raten, wo denn was falsch läuft. Dann kannst Du ach die unsinnige letzte Zeile ("Taste drücken") löschen.
Um.. wie gib ich denn das ganze Programm in die Eingabeaufforderung? Ctrl + v funkt. ja nicht.
Benutzeravatar
noisefloor
User
Beiträge: 4253
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Um.. wie gib ich denn das ganze Programm in die Eingabeaufforderung? Ctrl + v funkt. ja nicht.
? - Hm? Eintippen ist im Terminal immer eine gute Wahl ;-)

Welches Betriebssystem benutzt du?

Gruß, noisefloor
Magnetonstar
User
Beiträge: 14
Registriert: Montag 16. November 2015, 18:46

noisefloor hat geschrieben:Hallo,
Um.. wie gib ich denn das ganze Programm in die Eingabeaufforderung? Ctrl + v funkt. ja nicht.
? - Hm? Eintippen ist im Terminal immer eine gute Wahl ;-)

Welches Betriebssystem benutzt du?

Gruß, noisefloor
Windows 7.
Also mit Eingabeaufforderung ist doch dieses schwarze Fenster gemeint, wo man einzelne Befehle eingeben kann?
Oder ist das etwas anderes.
Zur Info, wens eine Rolle spielt, ich benutze Sublime Text 3.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Und nein, du sollst das Programm nicht in die Eingabeaufforderung eingeben, sondern es in ihr starten. Sprich:
`python pfad/zum/skript.py`
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Magnetonstar: Du hast ja Dein Programm eine einer datei.py. In der Eingabeauffoderung gehst Du in das Verzeichnis, in der die Datei liegt und rufst sie per

Code: Alles auswählen

python datei.py
auf.
Magnetonstar
User
Beiträge: 14
Registriert: Montag 16. November 2015, 18:46

Sirius3 hat geschrieben:@Magnetonstar: Du hast ja Dein Programm eine einer datei.py. In der Eingabeauffoderung gehst Du in das Verzeichnis, in der die Datei liegt und rufst sie per

Code: Alles auswählen

python datei.py
auf.
Gibt es irgendeine Möglichkeit, die Fehlermeldung zu kopieren und dann hier einfügen? Oder bleibt mir nichts anderes übrig als abzuschreiben :|
Benutzeravatar
noisefloor
User
Beiträge: 4253
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

der Fehler ist eher für _dich_ gedacht - weil der hilft bei der Fehlersuche.

Du wirst wohl eine ValueError bekommen :-) Dann bekommt man übrigens nicht nur, wenn man bei z.B. bei der Fragen nach "die Wiese" "the green" eingibt.

Gruß, noisefloor
BlackJack

Also der Fehler ist auch für uns (helfende) wichtig und man kann aus der Eingabeaufforderung auch Text kopieren. Mit der Maus markieren und dann über das Menü das man beim Klick auf das Fenstericon bekommt beispielsweise.
Magnetonstar
User
Beiträge: 14
Registriert: Montag 16. November 2015, 18:46

BlackJack hat geschrieben:Also der Fehler ist auch für uns (helfende) wichtig und man kann aus der Eingabeaufforderung auch Text kopieren. Mit der Maus markieren und dann über das Menü das man beim Klick auf das Fenstericon bekommt beispielsweise.
die Blume le pré
Falsch, la fleur wäre die richtige Antwort gewesen
Traceback (most recent call last):
File "C:\Users\Jerome Keller\Desktop\Function.py", line 55, in <module>
a_1 = auflister(anz['anz_1']) #Das ist Aufgabe eins
File "C:\Users\Jerome Keller\Desktop\Function.py", line 51, in auflister
x = in_put(anz) # Diese Funktion verwenden eigentlich einfach nur zwei ander
e Funktionen (erneuer und in_put).
File "C:\Users\Jerome Keller\Desktop\Function.py", line 41, in in_put
print(korrigierer(verzeichniss_2[x]))
File "C:\Users\Jerome Keller\Desktop\Function.py", line 34, in korrigierer
d_list.remove(eingabe[0])
ValueError: list.remove(x): x not in list

Habe auch noch herausgefunden, dass es nicht nur bei 'Die Blume' vorkommen kann: Auch bei Stein und Die Wiese kann es vorkommen. Und sie kommt nicht nur, wenn ich 'le pré' eingebe. Sie kommt, wenn das wort falsch ist.
BlackJack

@Magnetonstar: Die Fehlermeldung sagt das versucht wird etwas aus der Liste zu entfernen was da gar nicht drin war. Das darfst Du halt nicht machen. Was hättest Du denn an der Stelle sonst erwartet?
Magnetonstar
User
Beiträge: 14
Registriert: Montag 16. November 2015, 18:46

BlackJack hat geschrieben:@Magnetonstar: Die Fehlermeldung sagt das versucht wird etwas aus der Liste zu entfernen was da gar nicht drin war. Das darfst Du halt nicht machen. Was hättest Du denn an der Stelle sonst erwartet?
Das ist es ja!
Sonst würde ich euch nicht um Rat fragen!
Es sollte eigentlich in der Liste sein! Ich habe alles tausend mal korrigiert, und es sollte einwandfrei funktionieren!
Es muss in der Liste sein! Ich verstehe das ganze nicht.

Code: Alles auswählen

def korrigierer(eingabe):
    for x in d_f_words:
        if x == eingabe[0]:
            y = d_f_words[x]
            if eingabe[1] == y:
                d_list.remove(eingabe[0]) 
                return "Richtig"
            else:
                d_list.remove(eingabe[0])
                return "Falsch, " + y + " wäre die richtige Antwort gewesen"
BlackJack

@Magnetonstar: Wieso muss das in der Liste sein? Das sehe ich nicht. Allerdings ist der Code auch sehr unübersichtlich und ich würde den Fehler da nicht weiter suchen, das hat nicht viel Sinn. Schreib das besser mal mit verständlicheren Namen und mit ”echten” Funktionen, also keine globalen Variablen und alle Werte ausser Konstanten sollten Funktionen als Argumente betreten und nicht einfach magisch von irgendwo her kommen. Das macht Programme total unübersichtlich und sehr schwer nachvollziehbar.
Benutzeravatar
noisefloor
User
Beiträge: 4253
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das Problem habe ich auch, dass das ganze extrem schwer nachvollziehbar ist...

Hier mal ein Programm, dass das gleiche macht:

Code: Alles auswählen

import random

ABFRAGEN = 2

de_fr_dict = {'die Blume ': 'la fleur',
              'der Stein ': 'la pierre',
              'die Wiese ': 'le pré'}
de_worte = list(de_fr_dict.keys())
for wort in random.sample(de_worte, ABFRAGEN):
    print('Bitte übersetzen:')
    eingabe = input(wort)
    if eingabe != de_fr_dict[wort]:
        print('Leider falsch. Korrekt ist: {}'.format(de_fr_dict[wort]))
    else:
        print('Richtig!')
Gruß, noisefloor
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@noisefloor: noch ein bißchen umständlich. Man kann sich gleich ein Sample von de_fr_dict.items() holen.
Benutzeravatar
noisefloor
User
Beiträge: 4253
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Sirius3 - stimmt, hatte ich nicht dran gedacht. Dann so:

Code: Alles auswählen

import random

ABFRAGEN = 2

de_fr_dict = {'die Blume ': 'la fleur',
              'der Stein ': 'la pierre',
              'die Wiese ': 'le pré'}
for wortpaar in random.sample(de_fr_dict.items(), ABFRAGEN):
    print('Bitte übersetzen:')
    eingabe = input(wortpaar[0])
    if eingabe != wortpaar[1]:
        print('Leider falsch. Korrekt ist: {}'.format(wortpaar[1]))
    else:
        print('Richtig!')
Gruß, noisefloor
Magnetonstar
User
Beiträge: 14
Registriert: Montag 16. November 2015, 18:46

noisefloor hat geschrieben:Hallo,

@Sirius3 - stimmt, hatte ich nicht dran gedacht. Dann so:

Code: Alles auswählen

import random

ABFRAGEN = 2

de_fr_dict = {'die Blume ': 'la fleur',
              'der Stein ': 'la pierre',
              'die Wiese ': 'le pré'}
for wortpaar in random.sample(de_fr_dict.items(), ABFRAGEN):
    print('Bitte übersetzen:')
    eingabe = input(wortpaar[0])
    if eingabe != wortpaar[1]:
        print('Leider falsch. Korrekt ist: {}'.format(wortpaar[1]))
    else:
        print('Richtig!')
Gruß, noisefloor
Danke Vielmals!

Code: Alles auswählen

print("Wilkommen bei dem Französischen Abfrager!")
print("Geben Sie einfach die französische Übersetzung ein.")
print("Wenn das Geschlecht nicht klar ist, bitte mit '(m)' oder '(f)' angeben!")
print(" ")

import random

de_fr_dict = {
	'die Blume ' : 'la fleur',
	'die Wiese ' : 'le pré',
	'der Stein ' : 'la pierre',
	"der Horizont " : "l'horizon (m)"
}

de_worte = list(de_fr_dict.keys())

aufgaben = 4
punkte = 0

for wort in random.sample(de_worte, aufgaben):
	eingabe_wort = input(wort)
	if eingabe_wort == de_fr_dict[wort]:
		print("Richtig!")
		punkte += 1
		del de_fr_dict[wort]
	else:
		print("Falsch, die Lösung wäre " + de_fr_dict[wort])
		del de_fr_dict[wort]

print(" ")
print("Sie haben " + str(punkte) + " von " + str(aufgaben) + " Wörtern richtig!")
print("Das wären " + str(100 / aufgaben * punkte) + "%")
input("Drücken sie Enter um zu Beenden")
Antworten