字符串中带有字母的 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 的练习)。
我才刚开始学编程,会有很傻的问题。 我使用字典制作 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 的练习)。