【问题标题】:Python simple for loop logic (index out of range)Python 简单的 for 循环逻辑(索引超出范围)
【发布时间】:2013-02-20 18:55:49
【问题描述】:

调用 DeleteButton 函数时出现错误“元组索引超出范围”。我正在尝试一次从列表中删除多个对象。谁能告诉我我的逻辑有什么问题?

def DeleteButton(self,event):
    sel = self.task_list.GetSelections()       

    length = len(sel)       

    for item in range (0, length):
        index = sel[item]
        self.task_list.Delete(index)
        sel = self.task_list.GetSelections()
        length = len(sel)

【问题讨论】:

  • 您正在修改您的sel 在您的loop 中。这可能会给您带来问题。
  • 哇!我意识到我不应该删除任何索引,但我应该始终删除循环中的第一个项目,直到没有更多要删除的内容。解决了我自己的问题,但感谢大家的关注!

标签: python for-loop wxpython logic wxwidgets


【解决方案1】:

从未有过使用 wxPython 的经验,我对此有点天真,但从我从文档中可以看出,以下内容不是更有意义吗?

def DeleteButton(self, event):
    for id in self.task_list.GetSelections():
        self.task_list.Delete(id)

GetSelections 似乎会返回一个列表,如果所选项目的 ids,那么为什么您的示例中的额外复杂性?

【讨论】:

  • 这比使用带有索引访问的 while 循环更“pythonic”。我认为这个答案是最易读的版本,尽管如果你真的想要的话,你可以使用 1 行版本:) map(self.task_list.Delete, self.task_list.GetSelections())
  • 这些绝对是两种更简单的放置方式。但是,我对这两个示例都有疑问。当我点击“删除任务”时,它只会删除选择中的第一个项目..
  • 您确定 GetSelections() 返回多个 id 吗?如果修改 Demian Brecht 的示例,在调用 Delete 之前打印 id,它会输出什么?
【解决方案2】:

您应该使用带有手动递增计数器的while 循环,而不是尝试在for 循环的每次迭代中重置范围的顶部,主要是因为这不起作用。

range(0, length)

创建一个list,然后通过for 循环对其进行迭代,并且可以认为在循环期间是不可变的,因此尝试重置length 不会像您认为的那样做将要。为了更明确地说明问题,这里有一些等效代码:

i = 5
l = range(0, i) # l now set to list [0, 1, 2, 3, 4]
for v in l:
    i = v # this has no effect, as l is already instantiated and separate from i

编辑:

为了回复您的评论,这里有一个 while 循环,它应该可以解决 for 循环问题(虽然不是您的代码中可能存在的其他问题)。

sel = self.task_list.GetSelections()
i = 0
while i < len(sel):
    index = sel[i]
    self.task_list.Delete(index)
    sel = self.task_list.GetSelections()
    i += 1

【讨论】:

  • 你介意给我看一个好的while循环的例子吗?这些东西把我绊倒了
猜你喜欢
  • 1970-01-01
  • 2018-05-19
  • 2021-09-02
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2019-04-17
  • 1970-01-01
相关资源
最近更新 更多