我正在尝试创建一个简单的程序,用您输入的消息中的字符替换为字母表中的下一个字母。
enalpha = ['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', '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', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
UserInput = input()
x = 0
y = 1
while x < 61:
UserInput = UserInput.replace(enalpha[x], enalpha[y])
x = x + 1
y = y + 1
print('Encoded Message: ')
print(UserInput)
无论输入什么,输出始终为0,但与在UserInput
中输入的字符数相同的0是数字。
我不了解的是,当我创建一个不使用用户输入的简单版本时,该程序似乎运行良好。
enalpha = ['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', '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', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
x = 'hey'
x = x.replace(enalpha[7], enalpha[2])
print(x)
如果我将原本的第7行更改为UserInput = 'eggs'
,则程序仍会弹出0000
。没有错误消息。我在这里做什么错了?
答案 0 :(得分:2)
您的代码将所有tx1
更改为a
,所有b
更改为b
,包括刚刚更改的c
到a
。此循环继续到最后一个字符b
。
如果您向后浏览字母或创建第二个 result 字符串,则可以避免多次更改字符。
您也可以一次浏览每个字符(在0
中)。
答案 1 :(得分:1)
简化示例:
enalpha = "abcdef"
message = "abcdef"
x = 0
y = 1
while x < len(enalpha) - 1:
message = message.replace(enalpha[x], enalpha[y])
print(message)
x = x + 1
y = y + 1
输出:
bbcdef
cccdef
ddddef
eeeeef
ffffff
如您所见,在循环的每次迭代中,越来越多的字母变得相同,并因此受到成功替换操作的影响。
这是您可以执行此操作的一种方法:
from string import ascii_lowercase, ascii_uppercase, digits
# string.digits looks like this: "0123456789"
# to get the desired "1234567890", we slice.
affected_chars = ascii_lowercase + ascii_uppercase + digits[1:] + digits[0]
message = "Hello World 1234567890"
for index, char in enumerate(message):
if char in affected_chars:
new_char_index = (affected_chars.find(char) + 1) % len(affected_chars)
new_char = affected_chars[new_char_index]
message = message[:index] + new_char + message[index+1:]
print(message)
输出:
Ifmmp Xpsme 234567890a
请注意原始消息中的最后一个字符“ 0”如何环绕我们的字母并变成“ a”。这是我故意设计的,但是您可以选择以不同的方式处理0。
答案 2 :(得分:0)
无论输入消息是什么,您当前的方法将执行61次替换,而只需要替换输入消息的字符(例如abc
-> bcd
)。
另外,由于规则“用字母表中的下一个字母替换” ,请考虑应如何替换0
。您可能会在下面找到旋转变体。
查看优化方式:
enalpha = ['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', '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', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
user_input = input()
res = ''
for c in user_input:
pos = enalpha.index(c)
res += enalpha[pos+1] if pos+1 < len(enalpha) else enalpha[0]
print('Encoded Message: ')
print(res)
示例输入/输出:
hello0
Encoded Message:
ifmmpa