尝试通过字符替换将一个文本转换为另一个文本,输出不正确

时间:2018-09-01 08:19:58

标签: python python-3.x replace

我正在编写代码,但没有得到所需的输出。如果有人可以指出我做错的事情来帮助我,那将是很棒的。我的代码是:

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,即我最初定义的长度,即空字符串

1 个答案:

答案 0 :(得分:0)

您的问题是您的循环在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的长度。另外,您也不会处理不存在的映射(例如空间),对于该映射,find将返回可能不正确的值。

修正您的代码:

字符串是不可变的。通过使用s = s + "...",您将创建许多扔掉性能的strings。请改用list,然后再使用''.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很好,因为您将键映射到值。对于字符串,甚至还有一些便利函数可以为您构建字典:

阅读:

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

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