web-dev-qa-db-fra.com

Dictionnaire Python3 itérer à travers les valeurs?

Salut tout le monde, j'essaye d'écrire un programme en Python qui fonctionne comme un jeu de quiz. J'ai créé un dictionnaire au début du programme contenant les valeurs sur lesquelles l'utilisateur sera interrogé. Sa mise en place comme suit:

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

J'ai donc défini une fonction qui utilise une boucle for pour parcourir les clés du dictionnaire et demander une entrée à l'utilisateur, puis comparer l'entrée entrée à la valeur associée à la clé.

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] )

Cela fonctionne bien la sortie ressemble à ceci:

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

Donc, ce que j'aimerais pouvoir faire, c'est avoir une fonction séparée qui pose la question dans l'autre sens, en fournissant à l'utilisateur les numéros de résolution et en lui demandant de saisir le nom de la norme d'affichage. Je souhaite donc créer une boucle for mais je ne sais pas vraiment comment (ou même si vous le pouvez) parcourir les valeurs du dictionnaire et demander à l'utilisateur de saisir les clés.

J'aimerais avoir une sortie qui ressemble à ceci:

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

J'ai essayé de jouer avec for value in PIX0.values() et cela m'a permis de parcourir les valeurs du dictionnaire, mais je ne sais pas comment l'utiliser pour "vérifier" les réponses de l'utilisateur par rapport aux clés du dictionnaire. Si quelqu'un pouvait aider, ce serait apprécié.

EDIT: Désolé, j'utilise Python3.

31
Ben Williams

En fonction de votre 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))

Vous devriez également prendre l’habitude d’utiliser la nouvelle syntaxe de formatage de chaîne ({} au lieu de l'opérateur %) à partir de PEP 3101:

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

58
chown

Vous pouvez rechercher la clé correspondante ou "inverser" le dictionnaire, mais compte tenu de la manière dont vous l'utilisez, il serait préférable de simplement itérer clé/valeur paires au début, ce que vous pouvez faire items(). Ensuite, vous avez les deux directement dans les variables et n'avez pas besoin d'une recherche du tout:

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

Vous pouvez bien sûr l'utiliser dans les deux sens.

Ou si vous n'avez pas réellement besoin du dictionnaire pour autre chose, vous pouvez le laisser tomber et avoir une liste ordinaire de paires.

3
Stefan Pochmann

Vous pouvez simplement rechercher la valeur qui correspond à la clé, puis vérifier si l'entrée est égale à la clé. 

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

En outre, vous devrez modifier la dernière ligne pour s'intégrer, de sorte que la clé sera imprimée au lieu de la valeur si vous obtenez la mauvaise réponse.

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

Aussi, je recommanderais d'utiliser str.format pour le formatage de chaîne au lieu de la syntaxe %

Votre code complet devrait ressembler à ceci (après avoir ajouté le formatage de chaîne)

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

Créez le dictionnaire opposé:

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

Ensuite, exécutez le même code sur ce dictionnaire (en utilisant PIX1 au lieu de PIX0).

BTW, je ne suis pas sûr de Python 3, mais dans Python 2, vous devez utiliser raw_input au lieu de input.

0
barak manos

Si toutes vos valeurs sont uniques, vous pouvez créer un dictionnaire inversé:

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

Résultat:

>>> PIXO_reverse

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

Vous pouvez maintenant utiliser la même logique qu'auparavant.

0
Mike Müller