【问题标题】:python index out of range for a helper/function帮助器/函数的python索引超出范围
【发布时间】:2016-02-24 17:58:55
【问题描述】:

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

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 的辅助函数:

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,这似乎很好,我对其他函数的逻辑似乎很好,不确定索引错误在哪里。

【问题讨论】:

    标签: python string python-3.x for-loop slice


    【解决方案1】:

    问题是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 分钟前写的函数,想知道里面发生了什么。编写可维护的代码非常重要!

    【讨论】:

    • 是的,如果函数变得更复杂,显然我会评论并有更好的 var 名称,我习惯于在我学习的上一语言中附加组合 2 个列表,很高兴知道我必须这样做方式。
    • 特别是在 Stack Overflow 上提问时,代码的可读性越高,获得帮助的可能性就越大(也越快):)
    • 你的意思是newl.extend(s)
    • 当然,但是他的代码使用了大量的切片(例如[:][:i]、...),所以我使用了等同于extend 的切片符号来保持一致。
    • 好点,我在这里发帖时会让我的代码更具可读性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多