2016-12-22 8 views
1

私はPythonでフラッシュカードのクイズチャレンジをしようとしています。これには、州とその都道府県をテキストファイルから取ることが含まれます。私はキーを使って辞書を作成するために、分割して分割することができました。Pythonファイルのランダムな選択が機能しない

しかし、毎回私は内のランダムな選択を使用するが、私は、forループの外にそれを取るとき、それは、一方で最後のキー(例えばワイオミング州)を出力ループのために、それが唯一の最初のキーを出力する(例えばアラバマ州)

ここで

import random 
with open("state_capitals.txt","r") as f: 
for line in f: 
    cleanedLine = line.strip().split(',') 
    state = cleanedLine[0] 
    capital = cleanedLine[1] 
    d = {} 
    d[state] = capital 
    while len(d)>0: 
     choice = random.choice(list(d.keys())) 

     print("What is the capital city of",choice,"?") 
     answer=input("Answer: ") 
+0

ファイル内のすべての行について、辞書をゼロから再作成しないでください。空の辞書を作成し、*各行に項目を追加します。 –

+0

ありがとう、私はそれを試したと思う(forループからwhileループを取る) – Corb691

+0

ありがとう、私はこのコードで混乱に自分自身を持っているように聞こえます。私は最初から始め、より効率的なソリューションを作り出そうとします。 – Corb691

答えて

1

問題は、forループの範囲内にwhileループがあることです。したがって、あなたは決してあなたの辞書に入ることはできません。しかし、ループをforループの外側に移動させても、別の問題は解決されません。 dforループ内に初期化します。これにより、空の辞書にリセットされたまま元のすべてのエントリが削除されます。

import random 

d = {} # Create the dict once, otherwise each loop will delete all previous entries 

with open("state_capitals.txt","r") as f: 
    for line in f: 
     cleanedLine = line.strip().split(',') 
     state = cleanedLine[0] 
     capital = cleanedLine[1] 
     d[state] = capital 

# Move this outside the while loop. There's no need to recreate it on every iteration 
states = list(d.keys()) 

# Move the while loop to be outside of the for loop 
while len(d)>0: 
    choice = random.choice(states) 

    print("What is the capital city of",choice,"?") 
    answer=input("Answer: ") 

    # Allow the user to type Quit/quit to break the loop 
    if answer.lower() == 'quit': 
     break 
+0

ありがとう!これも機能します。私はfの行の前に空のdictを移動し、ループを終了するためにパスを追加しました。それも働いた! – Corb691

+0

@ Corb691ようこそ。これで問題が解決した場合は、[これを回答として受け入れる]と考えていただければ幸いです(http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – roganjosh

+0

@ Corb691ありがとう。私はまた別の小さな変化を起こしました。州のリストを1回だけ生成することが賢明です。したがって、私は 'while'ループからそれを移動しました。これはおそらくあなたのコードには顕著な効果はありませんが、その辞書に10億アイテムがあれば、確実に辞書キーのリストを生成し続けることは望ましくありません。ユーザーが辞書に多くの項目を入力できるようにした場合は、ループ内でキーのリストを再生成する必要がありますが、新しい項目が追加された場合にのみ再生成する必要があります。 – roganjosh

0

(明らかにこれはテキストファイルを表示しません)、それは次のようになりますあなたのwhile len(d) > 0forループの内側にあるので、choice = random.choice(list(d.keys()))中に辞書が1つのキーだけを持っています。あなたはまた、すべてのforループ反復で辞書を再初期化します。

関連する問題