Python 将for循环转换为列表理解

Python 将for循环转换为列表理解,python,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) 我想把整个函数压缩成一行

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

您缺少添加任何“其他”字符的操作的三元部分:

... if c in r_l ... else c ...

现在,您需要将
else c
插入到正确的位置,作为翻译字符的替代品。我把它留给学生做练习。我相信这一提示会打开你的大脑通道。

你缺少添加任何“其他”字符的操作的三元部分:

... if c in r_l ... else c ...

现在,您需要将
else c
插入到正确的位置,作为翻译字符的替代品。我把它留给学生做练习。我相信这个暗示会打开你的大脑通道。

正如@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)

正如@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)

“我需要在一行上创建整个函数”几乎可以肯定没有必要这样做。@roganjosh我想为这个函数创建一个一行,更好吗?如果你想让结果和你想要的输入一样长
[a如果b或者c代表d in e]
,而不是
[a代表b in c如果d]
“我需要在一行上创建整个函数”几乎可以肯定,没有必要这样做。@roganjosh我想为这个函数创建一个单行程序,更好吗?如果您希望结果与您想要的输入一样长
[a If b else c for d in e]
,而不是
[a for b in c If d]