我有一个for
循环:
def decode(encoded):
r = []
a_l = string.ascii_letters
r_l = a_l[::-1]
for c in list(encoded):
if c in r_l:
i = a_l.index(c)
c = r_l[i]
r.append(c)
return "".join(r)
我想将整个功能压缩为单行。到目前为止,我已经提出了:
r = [r_l[a_l.index(c)] for c in encoded if c in r_l]
但是,这会跳过标点符号。我该怎么办?
如果您需要测试字符串,则使用atbash密码:
def atbash(payload):
all_letters = string.ascii_letters
all_letters_reversed = all_letters[::-1]
retval = []
for c in list(payload):
if c in all_letters:
index = all_letters.index(c)
c = all_letters_reversed[index]
retval.append(c)
return ''.join(retval)
答案 0 :(得分:2)
您缺少添加任何“其他”字符的操作的三元部分:
... if c in r_l ... else c ...
现在,您需要将else c
插入正确的位置以替代您的翻译字符。我把它留给学生作为练习。我相信该提示会阻塞您的大脑路径。
答案 1 :(得分:0)
正如@Prune所指出的那样,您缺少列表理解的三元部分。这是使用列表推导的代码的简短实现:
import string
def atbash(payload):
return ''.join([r_l[a_l.index(c)] for c in list(payload) if c in a_l])
def decode(encoded):
return ''.join([r_l[a_l.index(c)] if c in r_l else c for c in list(encoded)])
test = 'test'
a_l = string.ascii_letters
r_l = a_l[::-1]
x = atbash(test)
decode(x)