“One lineize”python语句

“One lineize”python语句,python,Python,我想知道一个人能否在一行中写出以下语句: new = '' for char in text: if char in blacklist: new += ' ' else: new += char 我尝试过,但出现语法错误: new = ''.join(c for c in text if c not in blacklist else ' ') 我知道不是更好或更漂亮,我只是想知道这是否可能。您在错误的位置使用了内嵌条件,如果没有else“”

我想知道一个人能否在一行中写出以下语句:

new = ''
for char in text:
    if char in blacklist:
        new += ' '
    else:
        new += char
我尝试过,但出现语法错误:

new = ''.join(c for c in text if c not in blacklist else ' ')

我知道不是更好或更漂亮,我只是想知道这是否可能。

您在错误的位置使用了内嵌条件,如果没有else“”,它会起作用,因为它只是iterable上的一个过滤器。事实上,您希望这样做:

new = ''.join(c if c not in blacklist else ' ' for c in text)
如果您愿意,也可以这样做:

new = ''.join(' ' if c in blacklist else c for c in text)
你差点就成功了:

''.join(c if c not in blacklist else ' ' for c in text)

如果y yz z本身是一个表达式,那么你不能通过把中间部分中的for C放在中间来分割它。

迭代它似乎是一个过于复杂的方法。为什么不使用一个


使用str的translate方法。生成白名单字符的字符串,用“”代替黑名单字符:

>>> table = ''.join(c if c not in 'axy' else ' ' for c in map(chr,range(256))) 
然后使用此表调用translate:

>>> 'xyzzy'.translate(table)
'  zz '

优雅的解决方案或表达方式也被称为“惯用的声音比一个好”-linized@Otto当前位置但他并不是要最优雅的。他特别要求一行,即使是在明确理解可能不会更好或更漂亮的情况下。这显示了相当不错的本能,因为惯用Python应该尽可能可读。在这种情况下,我确实认为他想要的一行程序恰好对有经验的Python程序员来说是可读的,因此它既是一行程序又是惯用的。我知道使用regex更容易,它只是一个没有常规表达式的具体示例,似乎有点过火。在JAB的答案和这个答案之间很难选择,因为在JAB编辑之前,它们几乎完全相同。我更喜欢这个,因为它包含了一点if..else三元表达式的解释。这一次也有一点点的好处,因为鼓励的语气几乎达到了目的。并不是说贾普的回答在任何方面都不好。
>>> 'xyzzy'.translate(table)
'  zz '