我正在创建一个函数,它接受一个字符串并返回输出的所有可能性,使用以下转换:
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']
这是我用来在索引st
处转换字符串i
的辅助函数:
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 :(得分: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分钟前写的那些故事,想知道那里发生了什么。编写可维护代码非常重要!