wake-up-neo.net

Python3-Wörterbuch durch Werte iterieren?

Hey alle, ich versuche, ein Programm in Python zu schreiben, das als Quizspiel fungiert. Ich habe am Anfang des Programms ein Wörterbuch erstellt, das die Werte enthält, für die der Benutzer abgefragt wird. Es ist wie folgt aufgebaut:

PIX0 = {"QVGA":"320x240", "VGA":"640x480", "SVGA":"800x600"}

Also habe ich eine Funktion definiert, die eine for-Schleife verwendet, um durch die Wörterbuchschlüssel zu iterieren, und fragt nach Eingaben des Benutzers und vergleicht die Benutzereingabe mit dem mit dem Schlüssel übereinstimmenden Wert.

for key in PIX0:
    NUM = input("What is the Resolution of %s?"  % key)
    if NUM == PIX0[key]:
        print ("Nice Job!")
        count = count + 1
    else:
        print("I'm sorry but thats wrong. The correct answer was: %s." % PIX0[key] )

Dies funktioniert einwandfrei und die Ausgabe sieht folgendermaßen aus:

What is the Resolution of Full HD? 1920x1080
Nice Job!
What is the Resolution of VGA? 640x480
Nice Job!

Ich möchte also in der Lage sein, eine separate Funktion zu haben, die die Frage anders stellt, dem Benutzer die Auflösungsnummern zur Verfügung stellt und den Benutzer den Namen des Anzeigestandards eingibt. Ich möchte also eine for-Schleife machen, weiß aber nicht wirklich, wie ich die Werte im Wörterbuch durchlaufen soll (oder ob es überhaupt möglich ist) und den Benutzer zur Eingabe der Schlüssel auffordert.

Ich hätte gerne eine Ausgabe, die ungefähr so ​​aussieht:

Which standard has a resolution of 1920x1080? Full HD
Nice Job!
What standard has a resolution of 640x480? VGA
Nice Job!

Ich habe versucht, mit for value in PIX0.values() zu spielen, und dadurch konnte ich die Wörterbuchwerte durchlaufen, aber ich weiß nicht, wie ich die Antworten des Benutzers anhand der Wörterbuchschlüssel "prüfen" soll. Wenn jemand helfen könnte, wäre ich dankbar.

EDIT: Sorry, ich benutze Python3.

31
Ben Williams

Abhängig von Ihrer Version:

Python 2.x:

for key, val in PIX0.iteritems():
    NUM = input("Which standard has a resolution of {!r}?".format(val))
    if NUM == key:
        print ("Nice Job!")
        count = count + 1
    else:
        print("I'm sorry but thats wrong. The correct answer was: {!r}.".format(key))

Python 3.x:

for key, val in PIX0.items():
    NUM = input("Which standard has a resolution of {!r}?".format(val))
    if NUM == key:
        print ("Nice Job!")
        count = count + 1
    else:
        print("I'm sorry but thats wrong. The correct answer was: {!r}.".format(key))

Sie sollten sich auch daran gewöhnen, die neue String-Formatierungssyntax ({} anstelle des %-Operators) aus PEP 3101 zu verwenden:

https://www.python.org/dev/peps/pep-3101/

58
chown

Sie könnten nach dem entsprechenden Schlüssel suchen oder das Wörterbuch "umkehren", aber wenn Sie bedenken, wie Sie es verwenden, ist es am besten, wenn Sie zuerst über den Schlüssel/Wert Paare iterieren, den Sie kann mit items() tun. Dann haben Sie beide direkt in Variablen und brauchen überhaupt keine Suche:

for key, value in PIX0.items():
    NUM = input("What is the Resolution of %s?"  % key)
    if NUM == value:

Das können Sie dann natürlich in beide Richtungen nutzen.

Oder wenn Sie das Wörterbuch nicht wirklich für etwas anderes benötigen, können Sie das Wörterbuch fallen lassen und eine gewöhnliche Liste von Paaren haben.

3
Stefan Pochmann

Sie können einfach nach dem Wert suchen, der dem Schlüssel entspricht, und dann prüfen, ob die Eingabe dem Schlüssel entspricht. 

for key in PIX0:
    NUM = input("Which standard has a resolution of %s " % PIX0[key])
    if NUM == key:

Außerdem müssen Sie die letzte Zeile entsprechend anpassen, sodass der Schlüssel anstelle des Werts gedruckt wird, wenn Sie die falsche Antwort erhalten.

print("I'm sorry but thats wrong. The correct answer was: %s." % key )

Ich würde auch die Verwendung von str.format für die Formatierung von Zeichenfolgen anstelle der %-Syntax empfehlen. 

Ihr vollständiger Code sollte wie folgt aussehen (nach dem Hinzufügen in der String-Formatierung)

PIX0 = {"QVGA":"320x240", "VGA":"640x480", "SVGA":"800x600"}

for key in PIX0:
    NUM = input("Which standard has a resolution of {}".format(PIX0[key]))
    if NUM == key:
        print ("Nice Job!")
        count = count + 1
    else:
        print("I'm sorry but that's wrong. The correct answer was: {}.".format(key))
1
michaelpri

Erstellen Sie das gegenüberliegende Wörterbuch:

PIX1 = {}
for key in PIX0.keys():
    PIX1[PIX0.get(key)] = key

Führen Sie dann stattdessen denselben Code für dieses Wörterbuch aus (verwenden Sie PIX1 anstelle von PIX0).

BTW, ich bin nicht sicher über Python 3, aber in Python 2 müssen Sie raw_input anstelle von input verwenden.

0
barak manos

Wenn alle Ihre Werte eindeutig sind, können Sie ein umgekehrtes Wörterbuch erstellen:

PIXO_reverse = {v: k for k, v in PIX0.items()}

Ergebnis:

>>> PIXO_reverse

{'320x240': 'QVGA', '640x480': 'VGA', '800x600': 'SVGA'}

Jetzt können Sie dieselbe Logik wie zuvor verwenden.

0
Mike Müller