我试图在这里添加另一个条件:
fword.write(' '.join([chr(c-13+97) if c-13+97>96 else chr(c-3+48) for c in ground_valid])+'\n')
fword.write(' '.join([chr(c-13+97) if c-13+97>96 else chr(c-3+48) for c in output_valid]))
但是我不太了解python 1衬里。根据我的理解,如果我扩展它将是:
for c in ground_valid:
if c-13+97>96:
fword.write(' '.join(chr(c-13+97)))
else if: # my condition
# instructions
else:
fword.write(' '.join(chr(c-3+48)))
我试过了,但我没有得到预期的输出。我做错了什么?
谢谢!
答案 0 :(得分:1)
这将是你的两个单行的类比:
# fword.write(' '.join([chr(c-13+97) if c-13+97>96 else chr(c-3+48) for c in ground_valid])+'\n')
lst = []
for c in ground_valid:
if c-13+97>96:
lst.append(chr(c-13+97))
else:
lst.append(chr(c-3+48))
fword.write(' '.join(lst)+'\n')
和
# fword.write(' '.join([chr(c-13+97) if c-13+97>96 else chr(c-3+48) for c in output_valid]))
lst = []
for c in output_valid:
if c-13+97>96:
lst.append(chr(c-13+97))
else:
lst.append(chr(c-3+48))
fword.write(' '.join(lst))
你现在更感谢他们吗?
您的单行的另一种更紧凑(更易阅读的imho)版本如下:
choises = {True: -13+97, False: -3+48}
fword.write(' '.join([chr(c + choises[c-13+97>96]) for c in ground_valid])+'\n')
fword.write(' '.join([chr(c + choises[c-13+97>96]) for c in output_valid]))
如果if-else
块没有elif
,那么你会想知道字典是否更好。
答案 1 :(得分:1)
fword.write(' '.join([chr(c-13+97) if c-13+97>96 else chr(c-3+48) for c in ground_valid])+'\n')
相当于:
tmp_list = []
for c in ground_valid:
if c-13+97>96:
tmp_list.append(chr(c-13+97))
else:
tmp_list.append(chr(c-3+48))
tmp_str = ' '.join(tmp_list)
fword.write(tmp_str + '\n')
也就是说,[<expression> for <variable> in <sequence>]
是一个列表推导,它评估为一个列表 - 它是map
的简写形式(语法也允许你filter
,但是没有用到你的例子)
这种情况下的表达式是chr(c-13+97) if c-13+97>96 else chr(c-3+48)
,它是三元运算符的python格式。例如,<expression1> if <condition> else <expression2>
与C中的<condition> ? <expression1> : <expression2>
相同。
你的错误是你在循环中调用join,而不是用循环构造一个列表并在结果上调用join。