Seite 1 von 2

Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 19:23
von Magnetonstar
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")

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 19:30
von noisefloor
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

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 19:38
von Magnetonstar
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.

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 19:55
von Sirius3
@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.

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 19:59
von Magnetonstar
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.

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 20:04
von noisefloor
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

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 20:07
von Magnetonstar
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.

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 20:10
von cofi
Und nein, du sollst das Programm nicht in die Eingabeaufforderung eingeben, sondern es in ihr starten. Sprich:
`python pfad/zum/skript.py`

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 20:11
von Sirius3
@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.

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 20:23
von Magnetonstar
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 :|

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 20:34
von noisefloor
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

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 20:39
von 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.

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 20:45
von Magnetonstar
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.

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 20:53
von 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?

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 21:01
von Magnetonstar
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"

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 21:25
von 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.

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 21:34
von noisefloor
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

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Montag 16. November 2015, 21:51
von Sirius3
@noisefloor: noch ein bißchen umständlich. Man kann sich gleich ein Sample von de_fr_dict.items() holen.

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Dienstag 17. November 2015, 07:44
von noisefloor
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

Re: Finde Fehler nicht (Französischer Abfrager)

Verfasst: Donnerstag 19. November 2015, 10:15
von Magnetonstar
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")