好的。我在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;
}
提前感谢您的帮助
在处理完
base32
列表的第i
项后,应增加i
。另外(对编辑的响应),以二维方式访问列表元素的方式是base32[i][j]
,即首先访问该项目的第i项,然后访问该项目的第j项。类似的情况也适用于base32[i][j][k]
编辑:看到您的javascript代码,我想说您也应该在python中使用
for
循环。这些将不那么容易出错。此外,您正在进行的拼接(仅删除一项)可以使用pop
完成。最后,在遍历列表时删除元素不是一个好主意;一种解决方案是以相反的顺序进行迭代。所以,把所有这些放在一起,你最终会得到:在这个循环的最后一次迭代中,循环条件
i < len(base32)
仍然为真,因此循环执行最后一次。但是随后i
在循环内递增,所以现在base32[i]
超出了范围通常,循环变量的递增应该在循环的底部完成,这样就不会在循环变量值可能太大的情况下执行代码
相关问题 更多 >
编程相关推荐