Python - are there other ways to apply a function and filter in a list comprehension?
多年来这一直让我恼火。
如果我有一个单词列表:
1 2 | words = [ 'one', 'two', 'three', '', ' four', 'five ', 'six', \ 'seven', 'eight ', ' nine', 'ten', ''] |
即使它是超轻量的,我仍然觉得写这张单子很奇怪:
1 | cleaned = [ i.strip() for i in words if i.strip() ] |
号
我不喜欢应用strip()两次。只是看起来很傻。
它的速度有点/可以忽略,就像这样:
1 2 | _words = [ w.strip() for w in words ] cleaned = [ w for w in _words if w ] |
也和
1 | cleaned = [ i for i in [ w.strip() for w in words ] if i ] |
。
我想知道还有没有其他的方法来写这个。
我对嵌套循环形式的列表理解非常感兴趣(参见扁平浅嵌套列表的习惯用法:它是如何工作的?)但我什么都想不出来。
更新我在Github上建立了基准,概述了我最初的3种方法,以及下面分享的方法。
- https://gist.github.com/jvanasco/8793879
最快的是@martijn pieters
所有涉及到的速度差异,预计,可以忽略不计,不值得分享。
发电机的表达:
1 | cleaned = [i for i in (word.strip() for word in words) if i] |
方法:
1 | cleaned = filter(None, map(str.strip, words)) |
后者produces发生器3适用于
1 | cleaned = [i for i in map(str.strip, words) if i] |
我有一个小变化,我在哪里创建一个单值的临时列表:
1 2 3 | >>> cleaned = [stripped for word in words ... for stripped in [word.strip()] ... if stripped] |
更普遍的:
1 2 3 | >>> values = [transformed for value in sequence for transformed in [transform(value)] if want(transformed)] |