0

我想知道是否可以在一行中写下以下语句:

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

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

4

4 回答 4

3

迭代它似乎是一种过于复杂的方法。为什么不使用正则表达式

import re
blacklist = re.compile(r'[xyz]') # Blacklist the characters 'x', 'y', 'z'
new = re.sub(blacklist, ' ', text)
于 2012-07-06T18:31:01.390 回答
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)
于 2012-07-06T18:26:16.383 回答
2

你几乎拥有它:

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

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

于 2012-07-06T18:26:25.213 回答
0

使用 str 的 translate 方法。构建一个白名单字符字符串,用 ' ' 代替黑名单字符:

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

然后用这个表调用翻译:

>>> 'xyzzy'.translate(table)
'  zz '
于 2012-07-06T18:45:12.257 回答