皆さん、クイズゲームとして機能するプログラムを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を使用しています。
バージョンに応じて:
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から新しい文字列フォーマット構文({}
演算子の代わりに%
演算子)を使用する習慣を身に付ける必要があります。 :
対応するキーを検索するか、辞書を「反転」できますが、使用方法を考慮すると、最初にキー/値pairsを反復処理するのが最善です。 items()
でできます。次に、両方を変数に直接持ち、ルックアップをまったく必要としません:
for key, value in PIX0.items():
NUM = input("What is the Resolution of %s?" % key)
if NUM == value:
もちろん、その両方の方法を使用できます。
または、実際に他の何かのために辞書を必要としない場合、辞書を捨てて、ペアの通常のリストを持つことができます。
キーに対応する値を探して、入力がキーに等しいかどうかを確認するだけです。
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))
反対の辞書を作成します。
PIX1 = {}
for key in PIX0.keys():
PIX1[PIX0.get(key)] = key
次に、代わりにこの辞書で同じコードを実行します(PIX1
の代わりにPIX0
を使用)。
ところで、Python 3についてはわかりませんが、Python 2では、input
の代わりにraw_input
を使用する必要があります。
すべての値が一意である場合、逆辞書を作成できます。
PIXO_reverse = {v: k for k, v in PIX0.items()}
結果:
>>> PIXO_reverse
{'320x240': 'QVGA', '640x480': 'VGA', '800x600': 'SVGA'}
これで、以前と同じロジックを使用できます。