多年来一直困扰着我。
鉴于我有一个单词列表:
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展平浅嵌套列表:它是如何工作的?),但我什么都找不到。
我在github上建立了基准,概述了我最初的3种方法,并在下面共享了这些方法。
最快的是@Martijn Pieters filter()
; 将内部列表转换为生成器表达式对速度的影响可以忽略不计,但是对于内存管理来说应该更好(根据python的docs)。
预期所有涉及的速度差异可以忽略不计,不值得分享。
生成器表达式:
cleaned = [i for i in (word.strip() for word in words) if i]
使用filter()
和map()
:
cleaned = filter(None, map(str.strip, words))
后者在Python 3中产生一个生成器。适用list()
于它或map()
与列表理解结合使用:
cleaned = [i for i in map(str.strip, words) if i]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句