无法从列表中删除项目,但显然在那里

欧文·佩雷斯

我一直在阅读《使用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,但我认为它与仅使用[:]相同,因此,无论如何,感谢所有帮助!谢谢

kaya3

问题似乎是您尝试删除同一元素三次:

        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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

类属性显然在那里,但是python无法找到它

来自分类Dev

类属性显然在那里,但是python无法找到它

来自分类Dev

列在那里,但是当我尝试删除它时,它说MYSQL中没有列?**错误代码:1091。无法删除... **

来自分类Dev

列在那里,但是当我尝试删除它时,它说MYSQL中没有列?**错误代码:1091。无法删除... **

来自分类Dev

Cookie在那里,但我无法在CodeIgniter中获得它们。为什么?

来自分类Dev

Devise无法检测到:omniauthable,但是它在那里

来自分类Dev

无法将json值打印到整数数组列表?保存在那里但无法退出循环?

来自分类Dev

我在 ListView 上实现了删除按钮,它正在工作,但单击后项目在那里,它将如何从那里删除

来自分类Dev

事件preventDefault显然在Meteor中无法正常工作

来自分类Dev

Aapt失踪,但在那里

来自分类Dev

我收到FileNotFoundException但文件在那里

来自分类Dev

jQuery:缩小以居中并留在那里

来自分类Dev

杀死#### 但进程还在那里?

来自分类Dev

尽管文件在那里,但在 Python 项目中获取 FileNotFoundError

来自分类Dev

无法选择我的领域,也无法使用 codeception 在那里写字

来自分类Dev

在工具栏上删除不起作用,投射问题在那里显示

来自分类Dev

Javascript - 使 div 淡入,在那里停留一段时间,然后淡出并删除它

来自分类Dev

Python RegEx 删除新行(不应该在那里)

来自分类Dev

VLC:如何调整播放列表?按钮不在那里

来自分类Dev

无法打开共享的对象文件,但是库文件就在那里

来自分类Dev

无法使用[UIImage imageWithContentsOfFile:]创建UIImage,并且文件在那里

来自分类Dev

Noip“无法找到配置文件”,但是文件在那里

来自分类Dev

无法使用[UIImage imageWithContentsOfFile:]创建UIImage,并且文件在那里

来自分类Dev

无法自动布局以使两个按钮并排留在那里

来自分类Dev

无法通过 id 或标签找到片段....但它在那里

来自分类Dev

Devexpress报表在“父报表”中获取“子报表摘要”值,并在那里显示

来自分类Dev

如何在MVC4中使用href?我被困在那里

来自分类Dev

如何在Bash中在终端窗口的底部显示文本,并使其停留在那里?

来自分类Dev

数组中未定义的索引,但是在那里

Related 相关文章

  1. 1

    类属性显然在那里,但是python无法找到它

  2. 2

    类属性显然在那里,但是python无法找到它

  3. 3

    列在那里,但是当我尝试删除它时,它说MYSQL中没有列?**错误代码:1091。无法删除... **

  4. 4

    列在那里,但是当我尝试删除它时,它说MYSQL中没有列?**错误代码:1091。无法删除... **

  5. 5

    Cookie在那里,但我无法在CodeIgniter中获得它们。为什么?

  6. 6

    Devise无法检测到:omniauthable,但是它在那里

  7. 7

    无法将json值打印到整数数组列表?保存在那里但无法退出循环?

  8. 8

    我在 ListView 上实现了删除按钮,它正在工作,但单击后项目在那里,它将如何从那里删除

  9. 9

    事件preventDefault显然在Meteor中无法正常工作

  10. 10

    Aapt失踪,但在那里

  11. 11

    我收到FileNotFoundException但文件在那里

  12. 12

    jQuery:缩小以居中并留在那里

  13. 13

    杀死#### 但进程还在那里?

  14. 14

    尽管文件在那里,但在 Python 项目中获取 FileNotFoundError

  15. 15

    无法选择我的领域,也无法使用 codeception 在那里写字

  16. 16

    在工具栏上删除不起作用,投射问题在那里显示

  17. 17

    Javascript - 使 div 淡入,在那里停留一段时间,然后淡出并删除它

  18. 18

    Python RegEx 删除新行(不应该在那里)

  19. 19

    VLC:如何调整播放列表?按钮不在那里

  20. 20

    无法打开共享的对象文件,但是库文件就在那里

  21. 21

    无法使用[UIImage imageWithContentsOfFile:]创建UIImage,并且文件在那里

  22. 22

    Noip“无法找到配置文件”,但是文件在那里

  23. 23

    无法使用[UIImage imageWithContentsOfFile:]创建UIImage,并且文件在那里

  24. 24

    无法自动布局以使两个按钮并排留在那里

  25. 25

    无法通过 id 或标签找到片段....但它在那里

  26. 26

    Devexpress报表在“父报表”中获取“子报表摘要”值,并在那里显示

  27. 27

    如何在MVC4中使用href?我被困在那里

  28. 28

    如何在Bash中在终端窗口的底部显示文本,并使其停留在那里?

  29. 29

    数组中未定义的索引,但是在那里

热门标签

归档