我刚刚开始学习编程,而且这是一个愚蠢的问题。 我使用字典制作了ROT-13,但后来我决定使用字符串而不是字典。但问题是:
ROT_13 = "abcdefghijklmnopqrstuvwxyz"
text_input = input("Enter your text: ")
text_output = ""
for i in text_input:
text_output = text_output + ROT_13[i+13]
print (text_output)
然后发生了什么:
Traceback (most recent call last):
File "D:/programming/challenges/challenge_61.py", line 5, in <module>
text_output = text_output + ROT_13[i+13]
TypeError: must be str, not int
那么,有没有洗漱?或者更好地使用字典而不是字符串?
答案 0 :(得分:0)
您错过了转化:
ROT_13 = "abcdefghijklmnopqrstuvwxyz"
ROT_13_idx = {l: i for i, l in enumerate(ROT_13)}
text_input = input("Enter your text: ")
text_output = ''.join((ROT_13[(ROT_13_idx[i] + 13) % len(ROT_13)]
for i in text_input))
print(text_output)
答案 1 :(得分:0)
一些评论:
1)i
被误导性地命名 - 它是你的字符串中的一个字符,它将作为数组索引失败。
2)简单地将13添加到索引将无法旋转接近字母结尾的字母(模数运算符%
对此有用)。
3)正如您所指出的,字典是解决此问题的更好的数据结构。
这是您当前代码的工作修改,以帮助您入门。它的工作原理是使用find()
找到正确的字符,然后在找到的索引中添加13,最后用%
处理包装。请注意,find()
是线性时间。
ROT_13 = "abcdefghijklmnopqrstuvwxyz"
text_input = input("Enter your text: ")
text_output = ""
for i in text_input:
text_output += ROT_13[(ROT_13.find(i)+13)%len(ROT_13)]
print(text_output)
这是使用dict / list comprehensions和zip
的另一种方式:
rot13 = {k: v for k, v in zip("abcdefghijklmnopqrstuvwxyz", "nopqrstuvwxyzabcdefghijklm")}
print("".join([rot13[x] for x in input("Enter your text: ")]))
警告 :所有这些解决方案都无法区分大小写和非字母输入(读者的练习)。