过滤列表理解

时间:2013-09-03 12:30:26

标签: python python-3.x

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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])

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


以下是使用itertoolsfunctools的解决方案,适用于功能风格的粉丝:

from itertools import imap, filter
from functools import partial
modifier = partial(regex.sub, '\P{alpha}', '')
words = list(ifilter(None, imap(modifier, words)))

答案 2 :(得分: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有点难看。