首页 > 解决方案 > 试图通过字符替换将一个文本翻译成另一个文本,输出不正确

问题描述

我正在编写代码,但没有得到所需的输出。如果有人可以通过指出我做错了什么来帮助我,那就太好了。我的代码是:

shift = input()

word_original = input()
corrected_word = ""

keyboard_characters = "qwertyuiopasdfghjkl;zxcvbnm,./"

if shift == "R":
    for i in range(len(shift)-1):
        ind = keyboard_characters.find(shift[i]) + 1
        corrected_word = corrected_word + keyboard_characters[ind]

else:
    for i in range(len(shift)-1):
        ind = keyboard_characters.find(shift[i]) - 1
        corrected_word = corrected_word + keyboard_characters[ind]


print(len(corrected_word))

根据我的说法,我应该得到corrected_word,但它的长度为 0 ,即,这正是我最初定义的,即空字符串

标签: pythonpython-3.xreplace

解决方案


您的问题是您的循环for i in range(len(shift)-1):在您要使用的地方运行for i in range(len(word_original )-1):

这里不需要通过索引对字符串进行迭代,您可以简单地使用

for letter in word_original:
    substIdx = keyboard_characters.find(letter) + 1 
    [...]

'/'但是,如果您的文本包含因为您的索引现在超出 keyboard_characters长度,这将使您超出范围错误。此外,您不处理不存在的映射(fe 空间), find 将为其返回可能不正确的值。

修复您的代码:

字符串是不可变的。通过使用s = s + "..."你创造了很多strings一次性的,需要性能。使用 alist代替''.join(mylist)然后获取字符串。

shift = input() 
word_original = input()
corrected_word = []

keyboard_characters = "qwertyuiopasdfghjkl;zxcvbnm,./"
keyset = set(keyboard_characters) # tesint for 'in' faster on sets
lenk = len(keyboard_characters)   # compute once, use often

if shift == "R":
    for letter in word_original:
        if letter not in keyset: # no substitution? use as is
            corrected_word.append( letter )
            continue
        ind = keyboard_characters.find(letter) + 1

        if ind == lenk:
            ind = 0 # wrap around
        corrected_word.append(keyboard_characters[ind])

else:
    for letter in word_original:
        if letter not in keyset: # no substitution? use as is
            corrected_word.append( letter )
            continue
        ind = keyboard_characters.find(letter) - 1

        if ind < 0:
            ind = lenk # wrap around
        corrected_word.append( keyboard_characters[ind] )

corrected_word_str = ''.join(corrected_word)

print(corrected_word_str)

解决此任务的更好方法:

您尝试编写的代码已经有了使用 python 的解决方案 - 用于替换某些东西,dict当您将键映射到值时,s 非常棒。对于字符串,甚至还有为您构建 dict 的便利函数:

阅读:

如果查找中不存在字符,则按原样使用(空格 fe)

keyboard_characters = "qwertyuiopasdfghjkl;zxcvbnm,./"

# create replace dicts
# this mapps around - / is "before" q and q is "after" /
forward = str.maketrans(keyboard_characters,
                        keyboard_characters[1:] + keyboard_characters[0])

backward = str.maketrans(keyboard_characters,
                         keyboard_characters[-1] + keyboard_characters[:-1])

word_original = input()

forw = word_original.translate(forward)
back = word_original.translate(backward)

print(word_original, forw, back, sep="\n\n") 

输出:

# original text
some text with ;and / in it

# forward
dp,r yrcy eoyj zsmf q om oy

# backward
ainw rwzr qurg lpbs . ub ur

推荐阅读