Python: 使用索引和 str

Python: using indices and str

我正在尝试学习 Python 并且正在做一项有趣的作业,其中涉及翻译 "encrypted" 消息(只是字母表的倒转)。我的函数应该能够读取编码字符串,然后打印出其等效的解码字符串。然而,由于我是 Python 的新手,我发现自己在尝试使用列表的索引来给出值时不断地 运行 陷入类型错误。如果有人对更好的方法有任何指示,或者如果我只是错过了一些东西,那就太棒了。

def answer(s):
'''
All lowercase letters [a-z] have been swapped with their corresponding values
(e.g. a=z, b=y, c=x, etc.) Uppercase and punctuation characters are unchanged.

Write a program that can take in encrypted input and give the decrypted output
correctly.
'''
    word = ""

    capsETC = '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',\
          ' ', '?', '\'', '\"', '@', '!', '#', '$', '%', '&', '*', '(', \
          ') ', '-', '_', '+', '=', '<', '>', '/', '\'

    alphF = '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'

    alphB = 'z', 'y', 'x', 'w', 'v', 'u', 't', 's', 'r', 'q', 'p', 'o', 'n', 'm',\
        'l', 'k', 'j', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a'

    for i in s:
        if i in capsETC:  # if letter is uppercase or punctuation
            word = word + i  # do nothing
        elif i in alphB:  # else, do check
            for x in alphB: # for each index in alphB
                if i == alphB[x]: # if i and index are equal (same letter)
                    if alphB[x] == alphF[x]:  # if indices are equal
                        newLetter = alphF[x]  # new letter equals alpf at index x
            str(newLetter) # convert to str?
            word = word + newLetter # add to word

print(word)
s = "Yvzs!"

answer(s)

您当前的问题是您正在尝试使用字母作为索引。要修复您当前的方法,您可以在遍历每个字符串时使用 enumerate

如果您想要更简单的方法,可以使用 str.maketrans and str.translate。这两个内置函数有助于轻松解决此问题:

import string
unenc = string.ascii_lowercase # abcdefghijklmnopqrstuvwxyz
decd = unenc[::-1] # zyxwvutsrqponmlkjihgfedcba

secrets = str.maketrans(unenc, decd)
s = "Yvzs!"
print(s.translate(secrets))

输出:

Yeah!

如果您想要循环方法,可以使用 tryexcept 以及 string.index() 来实现更简单的循环:

import string
unenc = string.ascii_lowercase # abcdefghijklmnopqrstuvwxyz
decd = unenc[::-1] # zyxwvutsrqponmlkjihgfedcba

s = "Yvzs!"
word = ''
for i in s:
  try:
    idx = unenc.index(i)
  except:
    idx = -1
  word += decd[idx] if idx != -1 else i

print(word)

输出:

Yeah!

你的代码很好,只是做了一些改动(留下你的旧行作为注释)

def answer(s):

    word = ""

    capsETC = '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',\
          ' ', '?', '\'', '\"', '@', '!', '#', '$', '%', '&', '*', '(', \
          ') ', '-', '_', '+', '=', '<', '>', '/', '\'

    alphF = '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'

    alphB = 'z', 'y', 'x', 'w', 'v', 'u', 't', 's', 'r', 'q', 'p', 'o', 'n', 'm',\
        'l', 'k', 'j', 'i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a'

    for i in s:

        if i in capsETC:  # if letter is uppercase or punctuation

            word = word + i  # do nothing

        elif i in alphB:  # else, do check

            for x in range(len(alphB)): # for each index in alphB

                if i == alphB[x]: # if i and index are equal (same letter)

                    # if alphB[x] == alphF[x]:  # if indices are equal

                        newLetter = alphF[x]  # new letter equals alpf at index x

                       # str(newLetter) # convert to str?
                        word = word + newLetter # add to word

    return word


s = "Yvzs!"
print(s)
print(answer(s))

输出

Yvzs!
Yeah!

当然你可以让它变得更简单 python 的方式......但是想要尽可能少地改变你的代码