【发布时间】:2013-07-02 02:57:27
【问题描述】:
我正在用 python 编写一个 ROT13 脚本。它通过将字符串分成单个字符列表并使用 for 循环来工作,遍历每个字母并检查它是否需要被字典翻译。
问题在于它并不总是替换列表中的字母。我不知道为什么,但只有一些字符串有效。
代码如下:
import string
def rot13(m):
Data for ROT13 conversion
alphabet = list("abcdefghijklmnopqrstuvwxyz")
mapping = {}
for letter in alphabet:
mapping[letter] = alphabet[(alphabet.index(letter) + 13)%26]
for letter in alphabet:
mapping[letter.upper()] = alphabet[(alphabet.index(letter) +13)%26].upper()
# Create a list of the characters in order
characters = list(m)
# Go through each character in the list...
for character in characters:
# Check if that character is one that needs to be changed
if character in mapping:
# Test to chcek if it is finding characters correctly (it is)
print "%s to %s" % (character, mapping[character])
# replace the character with a new one (works inconsistently)
characters[characters.index(character)] = mapping[character]
#Bring it all together
result = string.join(characters, "");
return result
print rot13("ABCDEF") # Returns NOPQRS
print rot13("ABCDEFGHIJKLMNOPQRSTUVWXYZ") # Returns original string
第一个测试包含部分大写字母,结果与预期一样。但是,完整的字母表在通过我的 ROT13 函数时只返回原始字符串。
我确信问题出在第 20 行,characters[characters.index(character)] = mapping[character]。
这一行应该将列表中的字母替换为开头构建的 rot13 字典中的对应字母,但并不总是这样做。
在它之前有一行打印它正在测试的字符以及它应该根据字典更改为什么,并且总是有效的。但如果是这样,那为什么不是这一行呢?
【问题讨论】:
-
你应该使用
"".join(characters)而不是string.join(characters, "")(这是你必须为Python1做的方式) -
为什么您要导入
string模块? only 应该使用的东西是常量,而不是使用常量,而是使用 deprecated 函数。将alphabet = ...行替换为alphabet = list(string.lowercase)。顺便说一句:为什么您要将它们转换为lists?您可以遍历字符串中的字符。
标签: python list for-loop rot13