【问题标题】:Python - are there other ways to apply a function and filter in a list comprehension?Python - 还有其他方法可以在列表理解中应用函数和过滤器吗?
【发布时间】: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.stripNone 触发的默认过滤器行为。

标签: python list-comprehension


【解决方案1】:

生成器表达式:

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]

【讨论】:

  • 好主意。最后一个例子需要一个`if i`
  • @JonathanVanasco:确实。
  • 我刚刚注意到后两种方法的一个警告:str.strip 在 unicode 对象上失败; unicode.str 在字符串对象上失败。
  • @JonathanVanasco:你混合了这两种类型?然后使用lambda s: s.strip() 而不是str.strip
  • 我?我一直在使用 unicode。但这是堆栈溢出,因此在 python 2.x 上阅读此内容的人可能正在使用 string ,而在 3.x 上的另一个人正在使用 unicode。只是关心未来的读者。
【解决方案2】:

我有一个细微的变化,我创建了一个单值临时列表:

>>> cleaned = [stripped for word in words
...            for stripped in [word.strip()]
...            if stripped]

更笼统地说:

>>> values = [transformed for value in sequence
              for transformed in [transform(value)]
              if want(transformed)]

【讨论】:

  • 这是更易读的变体之一,感谢分享。它也是执行时间最长的。
  • 另外,你会接受答案吗?已经有一段时间了(c:
  • 哦,我以为我做到了。我用您的示例更新了基准测试要点 (gist.github.com/jvanasco/8793879)。它的运行时间是最快的 1.6 倍。 FWIW,我决定我喜欢 cleaned = [ i for i in [ w.strip() for w in words ] if i ] 在可读性与执行权衡方面。
猜你喜欢
  • 2014-09-17
  • 2016-12-23
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
相关资源
最近更新 更多