python-3.x 有没有一种方法可以不使用index()而保持相同的想法?

ujv3wf0j  于 2023-05-08  发布在  Python
关注(0)|答案(2)|浏览(194)
alphabet = ['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']

message = ["a", "d"]
shift = int(input("Type the shift number:\n"))

w = len(message)
z = len(alphabet)
for i in range(w):
    letter = message[i]
    for x in range(z):
        if letter == alphabet[x]:
            for g in range(x, z):
                letter = alphabet[shift]

    print(f" the final {letter}")

例如,移位是= 1,那么a应该变成b,d应该变成e,但我不知道为什么最后的print函数会为a和d都打印字母,值b
如果shift = 1,我期望在最后得到

the final b
 the final e
bqf10yzr

bqf10yzr1#

使用内置的str.translate方法。

from string import ascii_lowercase as alphabet
t = str.maketrans(alphabet, alphabet[shift:] + alphabet[:shift]))

shift = 3
message = "ad"

# outputs "ad -> dg" 
print(f'{message} -> {message.translate(t)}')
jk9hmnmh

jk9hmnmh2#

您可以使用enumerate而不是遍历索引来简化代码。保持相同方法(顺序搜索)的一个简单方法是预先准备一个移位字母表,并使用原始字母索引作为移位表中替换字母的位置

message = ["a", "d"]
shift   = int(input("Type the shift number:\n"))

shifted = alphabet[shift:]+alphabet[:shift]  # shifted alphabet
   
for i,letter in enumerate(message):      # each letter and position in message
    for j,alpha in enumerate(alphabet):  # find position in alphabet
        if alpha == letter:              # when match found 
            message[i] = shifted[j]      # replace letter in message

print(message) # ['b', 'e'] with a shift of 1

更高级的技术是使用内部字母数字直接计算替换字母的字符数(97是'a'的内部数字)。

message = ["a", "d"]
shift   = int(input("Type the shift number:\n"))

message = [chr((ord(c)-97+shift)%26+97) for c in message]

相关问题