索引器:列表索引超出python 3.8的范围

2024-05-15 09:45:30 发布

您现在位置:Python中文网/ 问答频道 /正文

好的。我在StackOverflow上看到过很多这样的问题,但没有一个真正对我有帮助。我正在编写一个python脚本,其中移动了一些base32代码。下面是有问题的函数:

def getCode():
    i = 0
    j = 0
    k = 0
    base32 = input("Please paste your code below:\n")
    base32 = base32.split("#")
    while i < len(base32):
        base32[i] = base32[i].split(",")
        i += 1
        while j < len(base32[i]):
            base32[i[j]] = base32[i[j]].split(" ")
            j += 1
            while k < len(base32[i[j]]):
                if base32[i[[j[k]]]] == "":
                    base32.list_splice(k, 1)
                k += 1
            if base32[i[j]].len() == 0:
                base32[i].list_splice(j, 1)
    return base32

我在前面定义了list_splice()。在此之后,我还声明了getCode()。当我运行它时,它会询问我的代码,但当我在之后按enter键时,它会告诉我:

Traceback (most recent call last):
  File "C:\Users\gabri\SynologyDrive\track_mover.py", line 43, in <module>
    getCode()
  File "C:\Users\gabri\SynologyDrive\track_mover.py", line 32, in getCode
    while j < len(base32[i]):
IndexError: list index out of range

我不知道为什么。据我所知,索引器通常指的是传入一个过高的列表索引,比如如果您有一个包含3个字符的字符串,则传递list[3]。我不知道它为什么这么说。我认为 虽然循环可以防止它失控,但也许不行?我尝试了各种长度的字符串,我粘贴到它,但这似乎不是答案

===

编辑

我尝试了Mustafa Aydın的答案,虽然这确实解决了一些问题,但它现在输出以下内容:

Traceback (most recent call last):
  File "C:\Users\gabri\SynologyDrive\track_mover.py", line 44, in <module>
    getCode()
  File "C:\Users\gabri\SynologyDrive\track_mover.py", line 33, in getCode
    base32[i[j]] = base32[i[j]].split(" ")
TypeError: 'int' object is not subscriptable

我不知道它为什么这样做。 我还得到了一些关于list_splice()函数的问题。它是javascript .splice()内置函数的python等价物。下面是它的代码:

def list_splice(target, start, delete_count=None, *items):
    """Remove existing elements and/or add new elements to a list.

    target        the target list (will be changed)
    start         index of starting position
    delete_count  number of items to remove (default: len(target) - start)
    *items        items to insert at start index

    Returns a new list of removed items (or an empty list)
    """
    if delete_count == None:
        delete_count = len(target) - start

    # store removed range in a separate list and replace with *items
    total = start + delete_count
    removed = target[start:total]
    target[start:total] = items

    return removed

如果有帮助,下面是我转换的JavaScript:

function loadCode(input) {
  var base32 = document.getElementById(input).value;
  var base32 = base32.split("#");
  for (var i = 0; i < base32.length; i++) {
    base32[i] = base32[i].split(",");
    for (var j = 0; j < base32[i].length; j++) {
      base32[i][j] = base32[i][j].split(" ");
      for (var k = 0; k < base32[i][j].length; k++) {
        if (base32[i][j][k] == "") {
          base32[i][j].splice(k, 1);
        }
      }
      if (base32[i][j].length == 0) {
        base32[i].splice(j, 1);
      }
    }
  }
  return base32;
}

提前感谢您的帮助


Tags: intargetlenifvarcountitemsdelete
2条回答

在处理完base32列表的第i项后,应增加i。另外(对编辑的响应),以二维方式访问列表元素的方式是base32[i][j],即首先访问该项目的第i项,然后访问该项目的第j项。类似的情况也适用于base32[i][j][k]

编辑:看到您的javascript代码,我想说您也应该在python中使用for循环。这些将不那么容易出错。此外,您正在进行的拼接(仅删除一项)可以使用pop完成。最后,在遍历列表时删除元素不是一个好主意;一种解决方案是以相反的顺序进行迭代。所以,把所有这些放在一起,你最终会得到:

def getCode():
    base32 = input("Please paste your code below:\n")
    base32 = base32.split("#")
    for i in reversed(range(len(base32))):
        base32[i] = base32[i].split(",")
        for j in reversed(range(len(base32[i]))):
            base32[i][j] = base32[i][j].split(" ")
            for k in reversed(range(len(base32[i][j]))):
                if base32[i][j][k] == "":
                    base32[i][j].pop(k)
            if len(base32[i][j]) == 0:
                base32[i].pop(j)
    return base32
while i < len(base32):
    base32[i] = base32[i].split(",")
    i += 1
    while j < len(base32[i]):

在这个循环的最后一次迭代中,循环条件i < len(base32)仍然为真,因此循环执行最后一次。但是随后i在循环内递增,所以现在base32[i]超出了范围

通常,循环变量的递增应该在循环的底部完成,这样就不会在循环变量值可能太大的情况下执行代码

相关问题 更多 >