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)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |