Python - 还有其他方法可以在列表推导中应用函数和过滤器吗?

Jon*_*sco 5 python list-comprehension

多年来,这一直困扰着我.

鉴于我有一个单词列表:

words = [ 'one', 'two', 'three', '', ' four', 'five ', 'six', \
         'seven', 'eight ', ' nine', 'ten', '']
Run Code Online (Sandbox Code Playgroud)

即使它超轻量级,我仍然觉得写这个列表理解很奇怪:

cleaned = [ i.strip() for i in words if i.strip() ]
Run Code Online (Sandbox Code Playgroud)

我不喜欢两次应用strip().它看起来很傻.

它像这样略微/可忽略不计:

_words = [ w.strip() for w in words ]
cleaned = [ w for w in _words if w ]
Run Code Online (Sandbox Code Playgroud)

这也是一样的

cleaned = [ i for i in [ w.strip() for w in words ] if i ]
Run Code Online (Sandbox Code Playgroud)

我想知道是否有其他方法可以写这个.

我对列表推导的嵌套循环形式感兴趣(参见Idiom用于展平浅嵌套列表:它是如何工作的?),但我无法弄清楚.

更新

我把基准测试放在github上,概述了我最初的3种方法,以及下面分享的方法.

最快的是@Martijn Pieters filter(); 将内部列表转换为生成器表达式对速度的影响可以忽略不计,但对于内存管理应该更好(根据python的文档).

所涉及的所有速度差异预计可以忽略不计,不值得分享.

Mar*_*ers 11

生成器表达式:

cleaned = [i for i in (word.strip() for word in words) if i]
Run Code Online (Sandbox Code Playgroud)

使用filter()map():

cleaned = filter(None, map(str.strip, words))
Run Code Online (Sandbox Code Playgroud)

后者在Python 3中生成一个生成器; 适用list()于它或map()与列表理解相结合:

cleaned = [i for i in map(str.strip, words) if i]
Run Code Online (Sandbox Code Playgroud)