2012-07-06 31 views
0

我想知道是否可以写如下语句在一个行:“一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 ' ') 

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

+1

优雅的解决方案或表达式也被称为“地道”(声音比“单一化”更好) – 2012-07-06 18:29:01

+1

@Otto:但他并没有要求最优雅。他特别要求提供一揽子计划,即使明确表示它可能不会“更好或更漂亮”。这显示了非常不错的直觉,因为*惯用语* Python *应该尽可能可读。在这种情况下,我确实认为他所要做的一切都是对于有经验的Python程序员来说是非常易读的,所以它既是一行代码又是一个惯用的代码。 – 2012-07-06 18:42:46

回答

2

你在错误的地方使用内联条件(如果你没有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) 
2

你几乎拥有了:

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

X if Y else Z本身就是一个表达式,所以你不能通过将for c in text部分放在中间来分割它。

+0

在JAB的答案和这个答案之间很难做出选择,因为它们几乎完全相同(或者在JAB编辑之前)。我喜欢这个更好,因为它包含了if..else三元表达式的一些解释。对于这个鼓励性音色(“几乎是这样”),也是一点点加分。并非JAB的答案在任何方面都不好。 – 2012-07-06 20:57:40

3

迭代它似乎是一个过度复杂的方式来做到这一点。为什么不使用regex

import re 
blacklist = re.compile(r'[xyz]') # Blacklist the characters 'x', 'y', 'z' 
new = re.sub(blacklist, ' ', text) 
+0

我用正则表达式知道它更容易,这只是一个没有正则表达式的具体例子 – olanod 2012-07-06 18:42:59

0

使用str的translate方法。到位黑名单的人的建设的白名单中字符的字符串,以“”:

>>> table = ''.join(c if c not in 'axy' else ' ' for c in map(chr,range(256))) 

然后调用与此表翻译:

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

这似乎只是有点矫枉过正。 – JAB 2012-07-06 18:47:26