我想知道是否可以写如下语句在一个行:“一lineize”蟒蛇声明
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 ' ')
我知道是不是更好或更漂亮,我只是想知道是否有可能。
我想知道是否可以写如下语句在一个行:“一lineize”蟒蛇声明
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 = ''.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)
X if Y else Z
本身就是一个表达式,所以你不能通过将for c in text
部分放在中间来分割它。
在JAB的答案和这个答案之间很难做出选择,因为它们几乎完全相同(或者在JAB编辑之前)。我喜欢这个更好,因为它包含了if..else三元表达式的一些解释。对于这个鼓励性音色(“几乎是这样”),也是一点点加分。并非JAB的答案在任何方面都不好。 – 2012-07-06 20:57:40
使用str的translate方法。到位黑名单的人的建设的白名单中字符的字符串,以“”:
>>> table = ''.join(c if c not in 'axy' else ' ' for c in map(chr,range(256)))
然后调用与此表翻译:
>>> 'xyzzy'.translate(table)
' zz '
这似乎只是有点矫枉过正。 – JAB 2012-07-06 18:47:26
优雅的解决方案或表达式也被称为“地道”(声音比“单一化”更好) – 2012-07-06 18:29:01
@Otto:但他并没有要求最优雅。他特别要求提供一揽子计划,即使明确表示它可能不会“更好或更漂亮”。这显示了非常不错的直觉,因为*惯用语* Python *应该尽可能可读。在这种情况下,我确实认为他所要做的一切都是对于有经验的Python程序员来说是非常易读的,所以它既是一行代码又是一个惯用的代码。 – 2012-07-06 18:42:46