私はPythonで退屈なものを自動化するを読んでいて、現在ランダムなクイズを生成するプロジェクトで立ち往生しています。私は本自体があなたにそれをする方法の例を与えるという事実を知っています、しかし私はいつもそれを自分でやってみるようにしています。しかし、今回は、スクリプトが機能しない理由を説明することはできません(関連するコード全体を貼り付けて、皆さんが自分で試してみることができるようにします)。
私のコードがどのように機能するかについての簡単な説明:最初に、いくつかのものを開いていくつかのファイル(ポイントではない)に書き込み、次に辞書の「ペア」から変数「状態」にキーを格納します。リスト。「状態」の項目の順序をシャッフルした直後に、各テストの「状態」の順序が異なります。次のforループ(for j instates [:] :)リストの「states」を変更してループに影響を与えないようにするため、「states」だけでなく「states [:]」を使用します。次に、別のループを追加して、クイズの各質問のオプションを生成します。「states [:]」の「j」項目を「states」から削除したので、「states [:]」は変更されず、「states」の項目は1つ少なくなります(正解です)。
import random
pairs = {'Alabama': 'Montgomery', 'Alaska': 'Juneau', 'Arizona': 'Phoenix',
'Arkansas': 'Little Rock', 'California': 'Sacramento', 'Colorado': 'Denver',
'Connecticut': 'Hartford', 'Delaware': 'Dover', 'Florida': 'Tallahassee',
'Georgia': 'Atlanta', 'Hawaii': 'Honolulu', 'Idaho': 'Boise', 'Illinois':
'Springfield', 'Indiana': 'Indianapolis', 'Iowa': 'Des Moines', 'Kansas':
'Topeka', 'Kentucky': 'Frankfort', 'Louisiana': 'Baton Rouge', 'Maine':
'Augusta', 'Maryland': 'Annapolis', 'Massachusetts': 'Boston', 'Michigan':
'Lansing', 'Minnesota': 'Saint Paul', 'Mississippi': 'Jackson', 'Missouri':
'Jefferson City', 'Montana': 'Helena', 'Nebraska': 'Lincoln', 'Nevada':
'Carson City', 'New Hampshire': 'Concord', 'New Jersey': 'Trenton',
'New Mexico': 'Santa Fe', 'New York': 'Albany', 'North Carolina': 'Raleigh',
'North Dakota': 'Bismarck', 'Ohio': 'Columbus', 'Oklahoma': 'Oklahoma City',
'Oregon': 'Salem', 'Pennsylvania': 'Harrisburg', 'Rhode Island': 'Providence',
'South Carolina': 'Columbia', 'South Dakota': 'Pierre', 'Tennessee':
'Nashville', 'Texas': 'Austin', 'Utah': 'Salt Lake City', 'Vermont':
'Montpelier', 'Virginia': 'Richmond', 'Washington': 'Olympia',
'West Virginia': 'Charleston', 'Wisconsin': 'Madison', 'Wyoming': 'Cheyenne'}
alternatives = [ "A", "B", "C", "D"]
for i in range(1): #each quiz
quiz = open("Quiz number %s.txt" % (i + 1), "w")
quiz.write(" "*16 + "STATE CAPITALS QUIZ\nTest %s" % (i + 1) + "\n")
quiz_answers = open("Answers for Quiz %s.txt" % (i + 1), "w")
states = list(pairs.keys())
random.shuffle(states)
for j in states[:]: #each question
options = []
quiz.write("\n%s" % (states[:].index(j) + 1) + ". What is the capital of " + j + "?\n")
quiz_answers.write("%s" % (states[:].index(j) + 1) + ". " + pairs[j] + "\n")
options.append(pairs[j]) #adds correct capital to options
print(j) #I added this line to see if the object j was a string
print(states) #I added this line to see if states was indeed a list
for k in range(3):
if j in states: #finally, i added an if statement to see if the item j was in the list states
print("fk") # and it does check out everytime I run the code
states.remove(j)
options.append(pairs[states[k]])
pass
random.shuffle(options)
これはまさに私のコードがどのように見えるかです。
ここで、問題は3番目のforループ(range(3)のfor k)にあります。アイテムを削除しようとしましたが、プログラムはエラーをスローします。正確には、「ValueError:list.remove(x):x notinlist」です。.remove()の直前にifステートメントを配置すると、コードを実行するたびにそのコンテンツが実行され、「fk」が出力されます。つまり、削除しようとしているオブジェクトは、実際には試行しているリストに属しています。から削除します。
誰かが私にこれが起こっている理由と、コードをあまり変更せずに(もちろん必要でない限り)それを修正する方法を説明してくれるといいのですが。コピーモジュールをインポートしてディープコピーを使ってみましたが、[:]を使ったのと同じだと思いますので、とにかく助けていただければ幸いです!ありがとうございました
問題は、同じ要素を3回削除しようとしていることのようです。
for k in range(3):
if j in states:
print("fk")
states.remove(j)
options.append(pairs[states[k]])
pass
このループには、の値を変更するものがないことに注意してくださいj
。そう:
j
がリストにあり、印刷してfk
、j
正常に削除します。j
は、はすでに削除されているため、何も出力されValueError
ず、もう存在しないためにが発生します。ValueError
はすでに発生しているため、3回目の反復はありません。論理的には、j
3回削除しても意味がありません。states.remove(j)
プログラムの実行に適した前または後のいずれかで、ステートメントをループの外に移動する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加