python索引超出帮助程序/函数的范围

2024-04-19 06:53:26 发布

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

我正在创建一个函数,它接收字符串并返回所有可能的输出,使用以下转换:

o -> 0  i,l -> 1
z -> 2  e -> 3
a -> 4  s -> 5
b -> 6  t -> 7
b -> 8  g,q -> 9 

例如:

print(transform_digits("Bow"))
['Bow', 'B0w', '6ow', '60w', '8ow', '80w']

下面是我用来在索引i处获取字符串st转换的helper函数:

def position_transform(st,i):
    letter=st[i]
    front = st[:i]
    back=st[(i+1):]
    l=[]
    if (letter=="o" or letter=="O"): l.append(front+"0"+back)
    elif (letter=="z" or letter=="Z"): l.append(front+"2"+back)
    elif (letter=="a" or letter=="A"): l.append(front+"4"+back)
    elif (letter=="b" or letter=="B"):
        l.append(front+"6"+back)
        l.append(front+"8"+back)
    elif (letter=="i" or letter=="I"or letter=="l" or letter =="L"): l.append(front+"1"+back)
    elif (letter=="e" or letter=="E"): l.append(front+"3"+back)
    elif (letter=="s" or letter=="S"): l.append(front+"5"+back)
    elif (letter=="t" or letter=="T"): l.append(front+"7"+back)
    elif (letter=="g" or letter=="G"or letter=="q" or letter =="Q"): l.append(front+"9"+back)
    return l

主要功能如下:

def transform_digits(st):
    l=[]
    l.append(st)
    newl=l[:]
    length=len(st)
    for x in range(0,length):
        for i in l:
            s=position_transform(i,x)
            newl.append(s)
        l=newl[:]
    return l

当我运行main函数时,我得到:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in transform_digits
  File "<stdin>", line 2, in position_transform
IndexError: list index out of range

我不确定这个错误在哪里。我试过在字符串上运行position_transform,结果似乎很好,其他函数的逻辑也很好,不确定索引错误在哪里。你知道吗


Tags: or函数字符串inbackpositiontransformfile
1条回答
网友
1楼 · 发布于 2024-04-19 06:53:26

问题是newl.append(s)。您将position_transform(i,x)的结果附加到列表中,但position_transform返回一个列表,因此列表中包含列表。这意味着,接下来,您将尝试position_transform并传递列表而不是字符串。列表中只有少数(1-2)项,远远少于字符串中的字符,这导致了IndexError。你知道吗

如果您想将一个列表的内容附加到另一个列表中,请使用[1:1]slice,这样您的赋值就会变成newl[1:1] = s。因此,嵌套的for-loop现在如下所示:

for x in range(0,length):
    for i in l:
        s=position_transform(i,x)
        newl[1:1] = s
    l=newl[:]

据我所知,这使得程序执行得很好。你知道吗

今后,我建议您选择使用更具描述性的变量名,并尝试在编写代码时对其进行注释。否则你可能会盯着你5分钟前写的东西,想知道里面发生了什么。编写可维护的代码非常重要!你知道吗

相关问题 更多 >