Hilfe mit dictionary Programm

Code-Stücke können hier veröffentlicht werden.
Antworten
lacreature
User
Beiträge: 17
Registriert: Dienstag 5. März 2019, 23:34

Dienstag 5. März 2019, 23:38

Also ich will ein kleines wörterbuch programm schreiben, dass man interaktiv erweitern oder zum abfragen nutzen kann. bisher weiß ich aber nicht wie ich die input eingabe mit dem dict verarbeiten kann. Kann mir jemand tipps geben, mit dem code weiter zu kommen. ist mein erstes programm, welches ich schreiben will :)

Code: Alles auswählen

fr_de={"rot":"rouge", "schwarz":"noir", "weiß":"blanc", "gelb":"jaunes", "gruen":"vert", "widerstand":"resistance"}
en_de={"rot":"red", "schwarz":"black", "weiß":"white", "gelb":"yellow", "gruen":"green", "widerstand":"resistance"}
dictionaries= {
        1: {'name':'fr_de'},
        2: {'name':'en_de'},
}

print("languageOPT:")
for x, y in dictionaries.items():
        print(x, ':',dictionaries[x]['name'])


while True:
        print("\nSelect a language: ")
        d_val=int(input())

        if d_val in dictionaries.keys():
                d_val=int(d_val)
                print("you chose {0}".format(dictionaries[d_val]['name']))
        else:
             print("something went bad..:(..")
        break

for d_val, dictionaries in enumerate(dictionaries):
        ask = input("ask for a word? -> type yes: ")
        if ask == "yes":
                searw=eval(input("which word you wanna know? -> "))
                print('{}.{}'.format("searw", dictionaries))
Benutzeravatar
__blackjack__
User
Beiträge: 5993
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mittwoch 6. März 2019, 00:06

@lacreature: Bitte mal gleich `eval()` wieder vergessen. Und dann den Versuch auf Variablen per eingebener Zeichenkette zugreifen zu wollen, oder über Zeichenketten die daraus abgeleitet werden. Für so etwas gibt es Wörterbücher (`dict`) um zum Beispiel die Zeichenkette 'fr_de' auf ein Wörterbuch abzubilden das Übersetzungen von Französisch nach Deutsch enthält.

`dictionaries` erscheint mir unnötig umständlich. Warum wird da eine Zahl auf ein Wörterbuch mit jeweils nur *einem* Schlüssel/Wert-Paar abgebildet? Warum überhaupt ganze Zahlen auf irgendetwas? Sinnvoller wäre es die Zeichenketten mit den beiden Sprachkürzeln direkt auf ein Wörterbuch mit den dazugehörigen Übersetzungen abzubilden.

Wenn man den Benutzer eine Zahl eingeben lassen möchte zur Auswahl des Wörterbuchs, dann kann man das über Code regeln.l

„languageOPT:“ ist eine komische Ausgabe. Da kann man auch etwas ausgeben was den Benutzer weniger raten lässt.

In der ersten Schleife wird `y` gar nicht verwendet. Sollte es aber. Und die Namen `x` und `y` sind schlecht, weil sie dem Leser nicht verraten was die Werte die dahinter stecken bedeuten. Genau dafür sind Namen aber da – um den Code verständlich(er) zu machen.

`d_val` ist auch kein guter Name. Was soll das `d_` bedeuten? Ist `val` die Abkürzung für `value`? Warum dann nicht einfach `value` schreiben, wenn man das meint. Abkürzungen sind nicht gut, und kryptische Prä- oder Postfixe auch nicht. `searw` ist auch wieder ein Ratespiel für den Leser.
long long ago; /* in a galaxy far far away */
lacreature
User
Beiträge: 17
Registriert: Dienstag 5. März 2019, 23:34

Mittwoch 6. März 2019, 01:51

ok danke schonmal.
das ist das erste mal das ich etwas programmiere.
die idee dahinter ist, eine art interaktives wörterbuch zu programmieren, indem man einerseits ein wort nachschlagen kann, andererseits bei bedarf einträge hinzufügen kann. aber erstmal kleine schritte :D
meinst du mit "zeichenketten (...) abbilden" dann so etwas?:

Code: Alles auswählen

dictionaries={
    'de_fr': {"rot":"rouge", "schwarz":"noir", "weiß":"blanc", "gelb":"jaunes", "gruen":"vert", "widerstand":"resistance"},
    'de_en': {"rot":"red", "schwarz":"black", "weiß":"white", "gelb":"yellow", "gruen":"green", "widerstand":"resistance"},
}
Ansonsten verstehe ich nicht wie man eine input eingabe mit dem dict() abgleichen kann.
Benutzeravatar
__blackjack__
User
Beiträge: 5993
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mittwoch 6. März 2019, 10:35

@lacreature: Jup, genau so meinte ich das mit dem Wörterbuch.

Was Du mit „wie man eine input eingabe mit dem dict() abgleichen kann“ ist mir dagegen jetzt nicht so klar. Du hast da Wörterbücher mit Zeichenketten als Schlüssel. Und `input()` liefert eine Zeichenkette zurück. Das erscheint mir recht trivial das zusammen zu bringen.

Vielleicht solltest Du auch erst einmal nur eine Sprache machen. Also eine Funktion die eines dieser inneren Sprachwörterbücher bekommt und wo der Benutzer dann Übersetzungen von abfragen kann. Wenn das funktioniert kannst Du eine Funktion schreiben, welche die `dictionaries`-Struktur aus Deinem Beitrag bekommt und den Benutzer eines der enthaltenen Wörterbücher auswählen kann, was die Funktion dann zurück gibt. In der Hauptfunkion kannst Du die beiden Funktionen dann hintereinander verwenden. Erst wählt der Benutzer über die erste Funktion ein Wörterbuch aus, und dann wird das an die andere Funktion übergeben.
long long ago; /* in a galaxy far far away */
lacreature
User
Beiträge: 17
Registriert: Dienstag 5. März 2019, 23:34

Mittwoch 6. März 2019, 20:19

Also ich habe das mal mit einer Sprache ausprobiert (sehr kompakt):

Code: Alles auswählen

de_fr = {"rot":"rouge","schwarz":"noir"}
dict = de_fr


print("which word: ")
search = str(input())
print("translation : " , dict.setdefault(search, None))
Wenn ich gleiches prinzip auf das zweisprachige dict anwende, klappt es nicht mehr, gibt es eine andere (oder elegantere) Variante als dict.setdefault()?
Sirius3
User
Beiträge: 11979
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 6. März 2019, 20:43

`input` liefert schon einen String, der Aufruf von `str` ist also überflüssig.
Statt `setdefault` willst Du wahrscheinlich `get` benutzen.
`dict` ist der Typ für Wörterbücher und sollte nicht überschrieben werden.

Code: Alles auswählen

de_fr = {"rot":"rouge","schwarz":"noir"}
print("which word: ")
search_word = input()
print("translation : " , de_fr.get(search_word, '???'))
Was hast Du denn beim "zweisprachigen dict" ausprobiert?
lacreature
User
Beiträge: 17
Registriert: Dienstag 5. März 2019, 23:34

Mittwoch 6. März 2019, 20:49

Also ich habe es jetzt mal so probiert und es funktioniert so weit auch, wahrscheinlich ist es immer noch nicht der eleganteste Weg, freue mich aber dass es läuft.

Code: Alles auswählen

dict={
    'de_fr': {"rot":"rouge", "schwarz":"noir", "weiß":"blanc", "gelb":"jaunes", "gruen":"vert", "widerstand":"resistance"},
    'de_en': {"rot":"red", "schwarz":"black", "weiß":"white", "gelb":"yellow", "gruen":"green", "widerstand":"resistance"},
}


print("available languages: " , list(dict))
 # shows available languages

print("\nSelect a language: ")
select = str(input())
 # user can select in which language to translate

if select == 'de_fr':
    print("What do you want to translate? -> ")
    search = str(input())
    print("translation: " , dict['de_fr'].setdefault(search , None))

if select == 'de_en':
    print("What do you want to translate? -> ")
    search = str(input())
    print("translation: " , dict['de_en'].setdefault(search , None))
Benutzeravatar
__blackjack__
User
Beiträge: 5993
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mittwoch 6. März 2019, 21:06

@lacreature: Da steht ein bisschen zu oft 'de_fr' und 'de_en' im Quelltext. Wenn `select` gleich 'de_fr' ist, dann verwendest Du 'de_fr' als Schlüssel und bei 'de_en' analog – dann nimm doch einfach `select` als Schlüssel, das hat den entsprechenden Wert ja bereits!

Und `dict` ist immer noch kein guter Name für etwas anderes als den eingebauten `dict`-Datentyp.
long long ago; /* in a galaxy far far away */
Sirius3
User
Beiträge: 11979
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 6. März 2019, 21:07

Wenn man Code einfach nur kopiert, hat man das Problem, dass man Änderungen an vielen Stellen machen will. Daher vermeidet man das, indem man Funktionen schreibt und diese dann aufruft. Hier kannst Du einfach das Unterwörterbuch einer Variable zuweisen und diese dann benutzen und hast keinen Unterschied mehr zwischen den zwei Fällen.

Code: Alles auswählen

dictionaries = {
    'de_fr': {"rot":"rouge", "schwarz":"noir", "weiß":"blanc", "gelb":"jaunes", "gruen":"vert", "widerstand":"resistance"},
    'de_en': {"rot":"red", "schwarz":"black", "weiß":"white", "gelb":"yellow", "gruen":"green", "widerstand":"resistance"},
}

print("available languages: " , list(dictionaries))

print("\nSelect a language: ")
select = input()
words = dictionaries[select]
print("What do you want to translate? -> ")
search_word = input()
print("translation: " , words.get(search_word , '???))
lacreature
User
Beiträge: 17
Registriert: Dienstag 5. März 2019, 23:34

Mittwoch 6. März 2019, 21:17

@Sirius3:
ah vielen Dank, genau nach so einer Lösung habe ich gesucht, bin nur nicht drauf gekommen, wie ich es umsetzen kann :)
lacreature
User
Beiträge: 17
Registriert: Dienstag 5. März 2019, 23:34

Mittwoch 6. März 2019, 23:10

Eine Frage hätte ich noch:
macht es mehr Sinn das dict() im Script zu behalten oder als externe Datei einzufügen?
Benutzeravatar
__blackjack__
User
Beiträge: 5993
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Donnerstag 7. März 2019, 00:21

@lacreature: Man könnte die Wörterbücher als JSON speichern. In der Standardbibliothek gibt es ein Modul dafür.
long long ago; /* in a galaxy far far away */
Antworten