ROT-13 与字符串中的字母



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

那么,有什么灵魂吗?或者最好使用字典而不是字符串?

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: "))))

当字符不按字母顺序但不处理大写时,这也处理了一个重要情况(读者练习(。

您缺少转化:

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)

相关内容

  • 没有找到相关文章

最新更新