【问题标题】:Why am I getting this Index out of range error?为什么我得到这个索引超出范围错误?
【发布时间】:2021-04-14 06:24:02
【问题描述】:

我是 Python 的初学者,我正在编写一些代码,它会从列表中随机选择一个字母,将其打印出来,然后将其从列表中删除,这样就不会再次被选中。该循环通过一个while循环重复。

import random

list = ["a", "b", "c", "d", "e", "f", "g", "h" , "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

yn = "y"

while yn == "y":
 npat = random.randint(0, 25)
 print(list[npat])
 del list[npat]
 yn = input("Again?: ")

它工作正常,但有时,选择的随机数显示在索引范围之外。

IndexError: list index out of range

在我看来它应该可以正常工作,但是有一个问题。谁能指出来?

【问题讨论】:

    标签: python


    【解决方案1】:

    每次del list[npat],列表都会变短。最终,random.randint(0, 25) 会为您提供一个超出范围的索引。

    不相关:list 是一个错误的变量名,因为您正在掩盖 list 内置函数。

    【讨论】:

      【解决方案2】:

      首先,不要调用列表list。给它另一个名字。

      问题是每次收到一封信后,您都会删除该信。因此,如果列表是 [1,2,3] 并且我得到 3,则删除 3。

      发生这种情况时,列表现在只有 2 个项目。早些时候,list[2] 可以工作。现在3 消失了,list[2] 也不存在了。

      要么您必须删除删除功能,要么您必须设置一个变量,每次选择一个字母时都会减少并获得随机数:

      import random
      
      lista = ["a", "b", "c", "d", "e", "f", "g", "h" , "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
      
      yn = "y"
      max = 25
      
      while yn == "y":
       npat = random.randint(0, max)
       print(npat)
       print(lista[npat])
       del lista[npat]
       max = max - 1
       yn = input("Again?: ")
      

      【讨论】:

      • max 也是一个 Callable,你知道的。 :)
      • 谢谢,我现在感觉很笨。我告诉过你我是新来的。你的方法使用起来很有意义,我不敢相信我没有发现我的错误。再次感谢!
      • 没问题!如果这有用,请标记为正确!
      • @HashimBinTalha 不要觉得自己很笨。你问了一个非常好的问题。不要低估需要的技能。没有多少初学者知道如何写出这样一个优秀的问题!
      【解决方案3】:

      lista 的大小在变化,特别是它的长度每次迭代都会减 1。这就是您收到IndexError 的原因。

      在循环前使用random.shuffle,从list的末尾取字母,那么就不用担心索引了。它更简单,并且意图明确:打印一个随机字母,不替换,直到所有字母都用完。

      import random
      
      letters = ["a", "b", "c", "d", "e", "f", "g", "h" , "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
      random.shuffle(letters)
      
      yn = "y"
      
      while yn == "y" and letters:
          print(letters.pop())
          yn = input("Again?: ")
      

      【讨论】:

      • 最佳答案。 :) 我花了几分钟时间写同样的东西。也许是因为我在从字符串导入 ascii_letters 后写了letters = list(ascii_letters[:26])) :)
      • 好电话。我更喜欢 letters 这个名字而不是 lista。从string.ascii_letters 构造list 比从小写字母显式构造要好得多。
      【解决方案4】:

      每次删除元素列表的大小都会减小。因此,在生成 (0,25) 之间的随机数时,有可能生成一个大于列表大小的数字。 因此,不要将大小固定为 (0,25),而是将其更改为 (0,len(lista)-1)。它会正常工作的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-22
        • 1970-01-01
        • 1970-01-01
        • 2016-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多