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))
根据我的说法,我应该得到corrected_word,但它的长度为 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
长度,这将使您超出范围错误。此外,您不处理不存在的映射(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
推荐阅读
- php - 如何使用 sql bootstrap php 组合搜索文本和复选框
- c - 这段代码中 `sut` 变量的用途是什么?为什么没有它的第二个片段不起作用?
- devextreme - truetext/false 文本属性在反应中不改变输出中的值
- react-native - 为 android 构建 react 本机应用程序的问题
- html - 屏幕最小时两个div的水平对齐
- javascript - 如何比较和提取另一个数组中的数组
- javascript - 为 HTML 着色基于点击
- java - 为什么我的触发器不能与 Hibernate 一起使用?
- elixir - (MatchError) cond 语句中右侧值不匹配
- android - 文本视图在 Android 中的位置不正确