Python:使用索引和str

Python:使用索引和str,python,python-3.x,loops,alphabet,Python,Python 3.x,Loops,Alphabet,我正在尝试学习Python,正在做一项有趣的作业,其中包括翻译“加密”消息(只是字母表的倒数)。我的函数应该能够读入一个编码字符串,然后打印出它的解码字符串等价物。然而,由于我是Python新手,我发现自己在尝试使用列表的索引来给出值时不断遇到类型错误。如果有人对更好的方法有任何建议,或者有什么我只是错过了,那就太棒了 def answer(s): ''' All lowercase letters [a-z] have been swapped with their corresponding

我正在尝试学习Python,正在做一项有趣的作业,其中包括翻译“加密”消息(只是字母表的倒数)。我的函数应该能够读入一个编码字符串,然后打印出它的解码字符串等价物。然而,由于我是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)
def答案:
'''
所有小写字母[a-z]都已与其对应的值交换
(例如a=z、b=y、c=x等)大写和标点符号不变。
编写一个可以接收加密输入并给出解密输出的程序
正确地
'''
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’
对于s中的i:
如果大写字母中有i:#如果字母是大写或标点符号
什么也不做
艾利夫:否则,请检查
对于alphB中的x:#对于alphB中的每个指数
如果i==alphB[x]:#如果i和index相等(同一个字母)
如果alphB[x]==alphF[x]:#如果指数相等
新字母=alpf[x]#新字母等于索引x处的alpf
str(newLetter)#转换为str?
word=word+新字母#添加到word
打印(word)
s=“Yvzs!"
答复:

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

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

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

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

Yeah!
Yeah!
如果需要循环方法,可以使用
try
except
以及来实现更简单的循环:

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!
Yeah!

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

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

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

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

Yeah!
Yeah!
如果需要循环方法,可以使用
try
except
以及来实现更简单的循环:

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!
Yeah!

您的代码很好,只是做了一些更改(将旧的行保留为注释)


当然,您可以用python的方式使其变得简单……但您希望尽可能少地更改代码

您的代码很好,只需进行一些更改(将旧代码保留为注释)


当然,您可以用python的方式使其变得非常简单……但您希望尽可能少地更改alphB中x的代码:不会在alphB中获得索引,它会提供实际对象。您可以在enumerate(alphB)中为i,x使用
获取索引
i
和项目
x
,或者您可以对范围内的x使用
(len(alphB)):
仅获取索引。
对于alphB中的x:
不获取
alphB
中的索引,它提供实际对象。您可以对枚举(alphB)中的i、x使用
获取索引
i
和项目
x
,或者您可以使用
来获取范围内的x(len(alphB)):
仅获取索引。哈,我正要对这个链接与您的答案进行注释。我要做的一个注释是,您可以使用
unec=string.lowercase
decd=''。join(list(reversed(unec)))
而不是列举所有的字母。感谢大家对这个问题的贡献!我将此添加到书签中,因为我认为今后学习更有效地解决这样的问题对我来说绝对是重要的。谢谢!哈,我正要对你的答案的链接发表评论。我要发表的评论是y您可以使用
unec=string.lowercase
decd='''.join(list(reversed(unec)))
不要列举所有的字母。感谢大家对这个问题的贡献!我将这个问题添加到书签中,因为我认为今后学习更有效地解决这样的问题对我来说绝对是重要的。谢谢!这太棒了!谢谢。我仍在努力掌握整个“Pythonic”“思考和做事的方式,所以我知道我的路线不是那样的。我当然喜欢较短的版本,但这是我目前所能想到的解决方案。谢谢你花时间来做这件事!这太棒了!非常感谢。我仍在努力掌握整个“蟒蛇式”的思维方式和做事方式,所以我知道我的路线不是那样的。我当然喜欢较短的版本,但这是我目前所能想到的解决方案。谢谢你花时间来做这件事!