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

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 filter();将内部列表转换为生成器表达式对速度的影响可以忽略不计,但对于内存管理来说应该更好(根据python的文档)。

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


发电机的表达:

1
cleaned = [i for i in (word.strip() for word in words) if i]

方法:filter()map()

1
cleaned = filter(None, map(str.strip, words))

后者produces发生器3适用于list()Python中;或把它理解map()与列表:

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)]