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

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: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
T429
User
Beiträge: 2
Registriert: Mittwoch 11. Dezember 2019, 15:18

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: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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"]),
    ...
]
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten