我一直在阅读《使用Python自动化无聊的东西》,目前我停留在生成随机测验的项目中。我知道以下事实:该书本身为您提供了示例,但我总是尝试自己尝试一下。但是这次,我无法解释为什么我的脚本不起作用(我将粘贴相关的整个代码,以便大家自己尝试)。
快速解释一下我的代码应该如何工作:首先,它打开并在几个文件(不是关键点)中写入一些内容,然后,将字典“ pairs”中的键存储为变量“ states”,作为清单。混洗后,项目立即按“状态”顺序排列,因此每个测试的“状态”顺序不同。下一个for循环(用于state [:]:中的j),因为我要修改列表“ states”,所以它不影响循环,所以我使用“ states [:]”而不是“ states”。然后添加另一个循环,为测验中的每个问题生成选项。我从“状态”中删除了“状态[:]”中的“ j”项,因此“状态[:]”保持不变,“状态”少了一项(正确的答案)。
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)
这正是我的代码的样子。
现在,问题出在第三个for循环中(对于range(3)中的k)。我尝试删除一个项目,但是程序抛出一个错误,恰好是:“ ValueError:list.remove(x):x不在列表中”。我在.remove()前面放了一条if语句,每次运行代码时,它都会运行其内容并显示“ fk”,这意味着我要删除的对象实际上属于我要尝试的列表从中删除。
如果有人可以给我一个解释,说明为什么会发生这种情况以及如何在不更改太多代码的情况下纠正它(当然,除非有必要),我将很乐意。我也尝试导入复制模块并使用deepcopy,但我认为它与仅使用[:]相同,因此,无论如何,感谢所有帮助!谢谢
问题似乎是您尝试删除同一元素三次:
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
已经提出,因此没有第三次迭代。从逻辑上讲,删除j
三遍是没有意义的。您应该在程序states.remove(j)
之前或之后将语句移出循环外,以适合于您的程序应该执行的操作为准。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句