2016-02-24 34 views
1

我提出一个函数,它在一个字符串并返回的输出所有的可能性,使用以下变换:蟒索引超出范围的辅助/功能

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 

当我运行的主要功能我得到:

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,这似乎工作得很好,我的其他功能的逻辑似乎很好,不知道索引错误的位置。

回答

0

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

+0

是的,很明显,我会评论和更好的var名称,如果功能变得更加复杂,我曾被用来追加组合2列表在我学习的前一种语言,很高兴知道我必须这样做。 –

+0

特别是当你在Stack Overflow上提出问题时,你的代码越可读,你就越有可能得到帮助(并且更快):) – mech

+0

你的意思是'newl.extend(s)'? – Aprillion