0

是否可以向此列表推导添加条件,使其结果不包含空字符串:

words = [regex.sub('\P{alpha}','',word) for word in words]
4

3 回答 3

4

将其移动到生成器表达式中并对其进行列表理解。

words = [x for x in (regex.sub('\P{alpha}', '', word) for word in words) if x]
于 2013-09-03T12:34:38.423 回答
3

您必须对结果列表进行后处理(并将结果转换为列表,根据 Ashwini 的评论):

words = list(filter(None, (regex.sub('\P{alpha}','',word) for word in words)))

您还可以将原始列表理解作为第二个参数传递:

words = filter(None, [regex.sub('\P{alpha}','',word) for word in words])

如果您期望许多替换产生空字符串,第一个可能更有效。


这是一个使用itertoolsand的解决方案functools,适用于功能风格的粉丝:

from itertools import imap, filter
from functools import partial
modifier = partial(regex.sub, '\P{alpha}', '')
words = list(ifilter(None, imap(modifier, words)))
于 2013-09-03T12:33:56.020 回答
0

您可以检查单词中的字母字符:

[regex.sub('\P{alpha}','',word) for word in words if list(filter(str.isalpha, word))]

这已经可以比其他方法更快(这取决于是否有单词变成空字符串),但是您最好不要使用正则表达式:

[x for x in ("".join(filter(str.isalpha, word)) for word in words) if x]

这相当快(在 Python 2.7 上测试过),并且在我看来,它不会对可读性造成太大影响,尽管它比我最初测试的 Python 2.7 中的要丑一些。

于 2013-09-03T13:32:34.977 回答