Dict mit 3 Values pro Key möglich?

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
T429
User
Beiträge: 2
Registriert: Mittwoch 11. Dezember 2019, 15:18

Dienstag 21. Januar 2020, 17:26

Nabend zusammen,

ich hock, wahrscheinlich wie viele vor mir an einer Art Vokabeltrainer, die ich allerdings nun gern umfunktionieren würde zu einem Quiz.
Mein erster Versuch einfach ein dict mit Fragen und eines mit Antworten zu nutzen erwies sich als ziemlich unpraktikabel,
da man in 95% der Fälle Antworten sofort ausschliessen konnte die absolut nicht zur Fragestellung passten.

Daher wüsst ich gern ob man einem dict key 3 oder mehrerer Werte zuweisen kann und die auch gezielt ansteuern. Hashmaps hat Python (soweit ich bisher weiss) ja nicht,
wobei ich die in Java vor Urzeiten auch teils umständlich verschachteln musste

Besten Dank
__deets__
User
Beiträge: 7375
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 21. Januar 2020, 17:42

Dicts sind hashmaps. Du kannst die also problemlos genauso verschachteln. Oder den Schlüssel auf ein 3-Tupel abbilden. Oder ein namedtuple aus dem collections-Modul benutzen. Oder eine Datenklasse mit attrs.
Benutzeravatar
pillmuncher
User
Beiträge: 1164
Registriert: Samstag 21. März 2009, 22:59
Wohnort: München

Dienstag 21. Januar 2020, 17:46

Python hat keine Hashmaps? Was glaubst du, was dicts sind?

Und ja, man kann dicts mit drei values pro key anlegen:

Code: Alles auswählen

>>> d = {
...    'a': ('b', 'c', 'd'),
...    'e': ('f', 'g', 'h')
... }
>>> d
{'a': ('b', 'c', 'd'), 'e': ('f', 'g', 'h')}
>>> d['a']
('b', 'c', 'd')
>>> d['a'][1]
'c'
>>> d['a'][2]
'd'
Genau genommen ist das immer noch nur ein einziger value pro key, nur sind die values eben drei-elementige tuple. Aber wir wollen hier mal keine Korinthen kacken.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
__blackjack__
User
Beiträge: 5148
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dienstag 21. Januar 2020, 19:12

Wobei Fragen als Schlüssel IMHO schon ein bisschen komisch sind, denn man greift ja normalerweise nicht über die Frage auf die Antworten zu, sondern arbeitet die Fragen/Antworten der Reihe nach ab, also ist das eher eine Sequenz, also eine Liste von Fragen + Antworten. Bei einer Liste kann man dann auch `random.shuffle()` ganz einfach benutzen damit die Fragen nicht immer in der gleichen Reihenfolge gestellt werden.
long long ago; /* in a galaxy far far away */
T429
User
Beiträge: 2
Registriert: Mittwoch 11. Dezember 2019, 15:18

Dienstag 21. Januar 2020, 21:25

Stimmt, Frage als Schlüssel ist komisch, da war ein Denkfehler im Hirn.

Und danke auch den anderen. Python ist mir (noch) relativ fremd und ich hab Dictionaries für eindimensional gehalten und mich nicht zu tief damit befasst.
Werd mir das verschachteln mal genauer ansehen :)
Benutzeravatar
snafu
User
Beiträge: 6023
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 22. Januar 2020, 05:51

Soll der Benutzer eine Auswahl aus mehreren Antworten habe? Dann wäre ein solches Schema denkbar:

Code: Alles auswählen

fragen = {
    frage1: 
        {antwort1: True, antwort2: False, antwort3: False},
    frage2:
        {antwort1: False, antwort2: False, antwort3: True},
...
}
for frage, antworten in random.sample(fragen.items(), len(fragen)):
    ...
Wobei man das Durchnummerieren natürlich im tatsächlichen Code nicht macht, sondern stattdessen Texte einsetzt.
Benutzeravatar
/me
User
Beiträge: 3328
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Mittwoch 22. Januar 2020, 08:25

T429 hat geschrieben:
Dienstag 21. Januar 2020, 21:25
Und danke auch den anderen. Python ist mir (noch) relativ fremd und ich hab Dictionaries für eindimensional gehalten und mich nicht zu tief damit befasst.
Ein Dictionary ist auch eindimensional, aber du kannst ja, wie gezeigt, als Wert ein Tupel nehmen. Für Listen gilt das natürlich auch und ein beliebiger Mix ist ebenfalls möglich. Die Tiefe ist nicht limitiert.
Benutzeravatar
__blackjack__
User
Beiträge: 5148
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mittwoch 22. Januar 2020, 09:41

@snafu: Denkbar, naja, es ist halt die falsche Datenstruktur. Man benutzt ja nie das Wörterbuch wenn man immer nur `items()` verwendet und nie tatsächlich auch mal per Schlüssel auf einen Wert zugreift. Und für die Antworten würde ich einfach festlegen das immer die erste Antwort die richtige ist und die dann bei der Abfrage vorher ”mischen”, damit die richtige Antwort nicht immer an der gleichen Stelle steht. Die Datenstruktur könnte dann so aussehen:

Code: Alles auswählen

fragen = [
    ("frage1", ["antwort1", "antwort2", "antwort3"]),
    ("frage2", ["antwort1", "antwort2", "antwort3"]),
    ...
]
long long ago; /* in a galaxy far far away */
Antworten