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]