用replace()替换的字符变为0s

时间:2019-07-18 18:53:54

标签: python

我正在尝试创建一个简单的程序,用您输入的消息中的字符替换为字母表中的下一个字母。

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。没有错误消息。我在这里做什么错了?

3 个答案:

答案 0 :(得分:2)

您的代码将所有tx1更改为a,所有b更改为b,包括刚刚更改的ca。此循环继续到最后一个字符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