我正在尝试用字母表中的字符替换反转字母表中的字符。这就是我所拥有的:
alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
rev_alphabet = alphabet[::-1]
sample = "wrw blf hvv ozhg mrtsg'h vkrhlwv?"
def f(alph, rev_alph):
return (alph, rev_alph)
char_list_of_tups = list(map(f, alphabet, rev_alphabet))
for alph, rev_alph in char_list_of_tups:
sample = sample.replace(rev_alph, alph)
print(sample)
Run Code Online (Sandbox Code Playgroud)
预期输出:你看了昨晚的剧集吗?
实际输出:wrw 你 svv ozst nrtst 的 vprsowv?
我知道我正在打印整个迭代的最后一个“替换”。如何避免这种情况,而不将其附加到列表中,然后遇到单词间距问题?
这里的问题是,每次执行替换时都会丢失数据;举一个简单的例子,考虑输入"az". 在第一次替换过程中,您替换'z'为'a',现在有了"aa"。当你用 替换时'a','z'它就变成了"zz",因为你无法区分已经替换的字符和仍然不变的字符。
对于单个字符替换,您需要使用该str.translate方法(以及不是严格必需的但有用的辅助函数str.maketrans),在一次传递中对字符串进行逐个字符的音译。
from string import ascii_lowercase # No need to define the alphabet; Python provides it
# You can use the original str form, no list needed
# Do this once up front, and reuse it for as many translate calls as you like
trans_map = str.maketrans(ascii_lowercase[::-1], ascii_lowercase)
sample = sample.translate(trans_map)
Run Code Online (Sandbox Code Playgroud)