【发布时间】:2014-02-27 14:35:22
【问题描述】:
这一直困扰着我多年。
鉴于我有一个单词列表:
words = [ 'one', 'two', 'three', '', ' four', 'five ', 'six', \
'seven', 'eight ', ' nine', 'ten', '']
即使它是超轻量级的,我仍然觉得写这个列表理解很奇怪:
cleaned = [ i.strip() for i in words if i.strip() ]
我不喜欢两次应用 strip()。看起来很傻。
像这样稍微/几乎可以忽略不计:
_words = [ w.strip() for w in words ]
cleaned = [ w for w in _words if w ]
也一样
cleaned = [ i for i in [ w.strip() for w in words ] if i ]
我想知道是否还有其他方法可以写这个。
我对列表推导的嵌套循环形式非常感兴趣(请参阅Idiom for flattening a shallow nested list: how does it work?),但我什么也想不通。
更新
我将基准放在 github 上,概述了我最初的 3 种方法,以及下面分享的方法。
最快的是@Martijn Pieters filter();将内部列表转换为生成器表达式对速度的影响可以忽略不计,但对于内存管理应该更好(根据 python 的文档)。
所涉及的所有速度差异都可以忽略不计,不值得分享。
【问题讨论】:
-
将内部列表转换为生成器。
-
关于更新:注意
filter/map组合可能不再是最快的,因为您不能再直接使用预先存在的方法和内置函数(此处为str.strip和None触发的默认过滤器行为。