web-dev-qa-db-ja.com

Python3辞書は値を反復処理しますか?

皆さん、クイズゲームとして機能するプログラムをPythonで作成しようとしています。プログラムの冒頭で、ユーザーがクイズされる値を含む辞書を作成しました。そのように設定します:

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

そこで、forループを使用して辞書キーを反復処理し、ユーザーからの入力を要求し、ユーザーの入力をキーと一致する値と比較する関数を定義しました。

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

これは正常に機能し、次のような出力になります。

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

だから、私ができるようにしたいのは、ユーザーに解像度番号を提供し、ユーザーに表示規格の名前を入力させる、別の方法で質問をする別の機能があることです。したがって、forループを作成したいのですが、辞書の値を反復処理する方法(または可能かどうか)がわからず、ユーザーにキーを入力するように依頼します。

次のような出力が必要です。

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

for value in PIX0.values()で遊んでみましたが、辞書の値を繰り返し処理することができましたが、それを使用して辞書のキーに対するユーザーの回答を「チェック」する方法がわかりません。誰か助けていただければ幸いです。

編集:申し訳ありませんが、Python3を使用しています。

37
Ben Williams

バージョンに応じて:

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

また、PEP 3101から新しい文字列フォーマット構文({}演算子の代わりに%演算子)を使用する習慣を身に付ける必要があります。 :

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

71
chown

対応するキーを検索するか、辞書を「反転」できますが、使用方法を考慮すると、最初にキー/値pairsを反復処理するのが最善です。 items()でできます。次に、両方を変数に直接持ち、ルックアップをまったく必要としません:

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

もちろん、その両方の方法を使用できます。

または、実際に他の何かのために辞書を必要としない場合、辞書を捨てて、ペアの通常のリストを持つことができます。

3
Stefan Pochmann

キーに対応する値を探して、入力がキーに等しいかどうかを確認するだけです。

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

また、収まるように最後の行を変更する必要があるため、間違った答えを取得した場合、値の代わりにキーを出力します。

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

また、str.format構文の代わりに、文字列のフォーマットに % を使用することをお勧めします。

完全なコードは次のようになります(文字列の書式設定を追加した後)

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

反対の辞書を作成します。

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

次に、代わりにこの辞書で同じコードを実行します(PIX1の代わりにPIX0を使用)。

ところで、Python 3についてはわかりませんが、Python 2では、inputの代わりにraw_inputを使用する必要があります。

0
barak manos

すべての値が一意である場合、逆辞書を作成できます。

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

結果:

>>> PIXO_reverse

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

これで、以前と同じロジックを使用できます。

0
Mike Müller