Python 替换为replace()的字符将变为0

Python 替换为replace()的字符将变为0,python,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',

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

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)
如果我把原来的第7行改为UserInput='eggs',程序仍然会输出0000。没有错误消息。我做错了什么?

您的代码将所有a更改为b,所有b更改为c,包括刚刚更改为b的a。此循环持续到最后一个字符0

如果您向后查看字母表或创建第二个结果字符串,则可以避免多次更改字符。 您还可以一次检查userinput中的每个字符。

您的代码将所有a更改为b,将所有b更改为c,包括刚刚更改为b的a。此循环持续到最后一个字符0

如果您向后查看字母表或创建第二个结果字符串,则可以避免多次更改字符。 您还可以一次浏览userinput中的每个字符。

简化示例:

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
如您所见,随着循环的每次迭代,越来越多的字母变得相同,并因此受到后续替换操作的影响

这里有一种方法可以让你做到:

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。

简化示例:

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
如您所见,随着循环的每次迭代,越来越多的字母变得相同,并因此受到后续替换操作的影响

这里有一种方法可以让你做到:

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。

无论输入消息是什么,您当前的方法将执行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)

无论输入消息是什么,您当前的方法将执行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)