将for循环转换为列表理解

时间:2018-11-29 19:15:08

标签: python

我有一个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)

2 个答案:

答案 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)