Python 列表理解中的过滤器

Python 列表理解中的过滤器,python,python-3.x,Python,Python 3.x,是否可以将条件添加到此列表中,以使其结果不包含空字符串: words = [regex.sub('\P{alpha}','',word) for word in words] 您必须对结果列表进行后期处理(并根据Ashwini的评论将结果转换为列表): 您还可以将原始列表理解作为第二个参数传递: words = filter(None, [regex.sub('\P{alpha}','',word) for word in words]) 如果您希望许多替换生成空字符串,那么第一种方法可能更

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

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

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

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

words = filter(None, [regex.sub('\P{alpha}','',word) for word in words])
如果您希望许多替换生成空字符串,那么第一种方法可能更有效


以下是一个使用
itertools
functools
的解决方案,适用于功能型粉丝:

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

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

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

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

[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]

这相当快(在Python2.7上测试),在我看来,这对可读性没有太大影响,尽管它比我最初测试的Python2.7要难看一些。

要获得列表,请将筛选结果传递到
list()
。问题是Python3,因此不需要从itertools导入。但您仍然需要将筛选结果转换为列表。@为什么您可以将其作为一行而不是分成两行?
[x for x in ("".join(filter(str.isalpha, word)) for word in words) if x]