Seite 1 von 1

Schlüsselnamen anstatt Wert in Liste speichern

Verfasst: Donnerstag 4. November 2010, 17:38
von nomnom
Hallo! Ich programmiere mir gerade einen Vokabeltrainer. Ich speicher die Vokabeln als Wörterbücher mit ``pickle``. Wenn ich die Vokabel richtig eingebe, dann soll die Vokabel aus dem Wörterbuch verschwinden, ansonsten bleibt sie drin. Ich habe mir überlegt eine Liste zu haben, in der die Schlüssel (!) der Vokabeleinträge, die weg dürfen, gespeichert werden und am Ende sollen die Einträge, so wie ich sie im Quelltext zu löschen versuche, entfernt werden. Aber mir wird ja immer der Wert des Schlüssels in der Liste gespeichert. Wie kann ich den Schlüsselnamen speichern?

Code: Alles auswählen

#!/usr/bin/env python

import os
import cPickle as p

with open('list.pickle', 'r') as f:
    vocabulary = p.load(f)

to_delete = []

for key in vocabulary:
    quest = raw_input("Was bedeutet {0} auf Deutsch? ".format(key))
    if quest == vocabulary.get(key):
        print "Gut gemacht, richtig!"
        to_delete.append(vocabulary[key])
        # Ich moechte hier den Schluesselnamen und nicht den Wert!
    else:
        print "Schade, es ist falsch!"

for element in to_delete:
    del vocabulary[element]
    # Funktioniert natuerlich nicht. Ein KeyError wird stattdessen ausgegeben.

# Und hier wird dann spaeter der Teil mit pickle reinkommen
print vocabulary
EDIT: Bitte nur Lösungsansätze posten. Ich möchte auch etwas selber herausfinden, etwas dabei lernen :)

Re: Schlüsselnamen anstatt Wert in Liste speichern

Verfasst: Donnerstag 4. November 2010, 17:43
von EyDu

Code: Alles auswählen

to_delete.append(key)
Edit: Ach ja, benutze besser:

Code: Alles auswählen

for key, value in vocabulary.iteritems():
    quest = raw_input("Was bedeutet {0} auf Deutsch? ".format(key))
    if quest == value:
        ...

Re: Schlüsselnamen anstatt Wert in Liste speichern

Verfasst: Donnerstag 4. November 2010, 17:45
von nomnom
EyDu hat geschrieben:

Code: Alles auswählen

to_delete.append(key)
LOL, da änder ich grad den ersten Post, dass ich nur Lösungsansätze haben will, und zeitgleich kommt das :mrgreen:

Wow, meine Doofheit ist unbeschreiblich :D Das ich nach etwas kompliziertem suche, obwohl die Lösung ja ganz einfach ist :O

EDIT:
EyDu hat geschrieben:Edit: Ach ja, benutze besser:

Code: Alles auswählen

for key, value in vocabulary.iteritems():
    quest = raw_input("Was bedeutet {0} auf Deutsch? ".format(key))
    if quest == value:
        ...
Oh, dass man Ausdrücke wie

Code: Alles auswählen

for key, value in vocabulary.iteritems()
haben kann, war mir nicht bewusst. Ich werde es mir merken, auch wenn ich leider nicht vollkommen verstehe wie das funktioniert :|

Re: Schlüsselnamen anstatt Wert in Liste speichern

Verfasst: Donnerstag 4. November 2010, 21:32
von Leonidas
``iteritems()`` gibt eine Seqzuenz von Tupeln zurück, über diese wird dann mittels der ``for``-Schleife iteriert und dann kommt Tuple-Unpacking ins Spiel. Mit Tuple-Unpacking geht etwa sowas

Code: Alles auswählen

a, b = (23, 42)
(in diesem Fall würde man die Klappern üblicherweise weglassen, aber merk dir einfach dass man bei der Zuweisung von Tupel-Objekten auch auf die einzelnen Elemente des Tupels zugreifen kann)

Re: Schlüsselnamen anstatt Wert in Liste speichern

Verfasst: Donnerstag 4. November 2010, 21:51
von nomnom
Leonidas hat geschrieben:``iteritems()`` gibt eine Seqzuenz von Tupeln zurück, über diese wird dann mittels der ``for``-Schleife iteriert und dann kommt Tuple-Unpacking ins Spiel. Mit Tuple-Unpacking geht etwa sowas

Code: Alles auswählen

a, b = (23, 42)
(in diesem Fall würde man die Klappern üblicherweise weglassen, aber merk dir einfach dass man bei der Zuweisung von Tupel-Objekten auch auf die einzelnen Elemente des Tupels zugreifen kann)
Vielen vielen Dank :-) Jetzt hab ichs

Re: Schlüsselnamen anstatt Wert in Liste speichern

Verfasst: Donnerstag 4. November 2010, 21:52
von derdon
Leonidas hat geschrieben:

Code: Alles auswählen

a, b = (23, 42)
(in diesem Fall würde man die Klappern üblicherweise weglassen, […])
Gut, dann klappert es auch nicht so laut :lol: