Python 1衬里作为函数的参数

时间:2018-02-22 12:52:45

标签: python

我试图在这里添加另一个条件:

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

我试过了,但我没有得到预期的输出。我做错了什么?

谢谢!

2 个答案:

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