Python:如何使用元组数组替换字符串元素?

Ton*_*ony 0 python

我正在尝试用字母表中的字符替换反转字母表中的字符。这就是我所拥有的:

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?

我知道我正在打印整个迭代的最后一个“替换”。如何避免这种情况,而不将其附加到列表中,然后遇到单词间距问题?

Sha*_*ger 5

这里的问题是,每次执行替换时都会丢失数据;举一个简单的例子,考虑输入"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)