字符串中带有字母的 ROT-13

ROT-13 with alphabet in string

我才刚开始学编程,会有很傻的问题。 我使用字典制作 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

请问有什么解决办法吗?或者更好地使用字典而不是字符串?

您缺少一次转化:

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)

i 的命名具有误导性——它是字符串的一个字符,而不是整数,并且作为数组索引会失败。

简单地将 13 添加到索引将无法将字母旋转到字母表的末尾(模数运算符 % 对此很有用)。

这是对您当前代码的有效修改,以帮助您入门。它的工作原理是使用 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)

这是使用字典的另一种方式 zip:

from string import ascii_lowercase as alpha

rot13 = dict(zip(alpha, alpha[13:] + alpha[:13]))
print("".join(map(lambda x: rot13[x] if x in rot13 else x, input("Enter your text: "))))

这也处理了一个重要的情况,即字符不是字母顺序但不处理大写(reader 的练习)。