试图通过字符替换将一个文本转换为另一个文本,输出为

2024-10-04 11:24:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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))

在这里,根据我的说法,我应该得到正确的_单词,但它给出的长度是0,也就是说,它正是我最初定义的,也就是说,空字符串


Tags: 代码inforinputlenshiftrangefind
1条回答
网友
1楼 · 发布于 2024-10-04 11:24:30

您的问题是,您的循环在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长度。此外,您不处理不存在的映射(f.e.空格),因为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非常好,因为您可以将一个键映射到一个值。对于字符串,甚至还有一些方便的函数为您构建dict:

阅读:

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

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

相关问题 更多 >