【问题标题】:Python: cleaner list comprehensionPython:更清晰的列表理解
【发布时间】:2010-05-04 03:25:40
【问题描述】:

有没有更简洁的写法:

for w in [w for w in words if w != '']:

我想遍历字典 words,但只遍历 != '' 的单词。谢谢!

【问题讨论】:

  • “不是空格的单词”,正如下面的评论员指出的那样,!= ""不同。如果需要,请使用 isspace 方法。
  • 抱歉,我说错了,我不是指空格(已编辑)。

标签: python list-comprehension


【解决方案1】:

您在这里不需要 listcomp。随便写:

for w in words:
    if w != '':
        # ...

【讨论】:

  • @Daniel Goldberg,谁说过,我认为'for'是为了迭代,而当 OP 这样做时,它是矫枉过正的,@dan04 +1,这是正确的方法......IMO
  • 如果你不想有另一个缩进级别,你总是可以有if w == "": continueif not w: continue,这是我经常看到的。
  • @Goldberg:Listcomps 优于将 .append 附加到列表的循环,而不是一般的循环。
【解决方案2】:

假设你在寻找钥匙,为什么不试试呢:

[w for w in words if w]

【讨论】:

    【解决方案3】:

    测试元素不等于'' 不会过滤掉空白元素。如果这就是您所追求的,您可能想要使用str.isspace(或正则表达式)。

    如果您使用列表推导,您将制作列表的额外副本作为中间对象。可能没什么大不了,但生成器不会使用额外的内存。

    我会这样做,使用发电机:

    for word in (w for w in words if not w.isspace()):
        # do stuff
    

    【讨论】:

      【解决方案4】:

      我认为您的解决方案是次优的。您正在迭代列表 words 两次 - 一次在列表推导中创建非空项,然后再次在循环中进行处理。如果你使用这样的 genexp 会更好。

      for w in (x for x in words if x): process(w)
      

      这样,genexp 将延迟返回一个非空列表。

      【讨论】:

      • for w in words: if x: process(w) 对我来说似乎更简单、更短、更清晰。
      【解决方案5】:

      filter(lambda w: w != '', words)filter(None, words)

      这是建议,它可能不是您问题的最佳解决方案。

      【讨论】:

      • "filter(P, S) 几乎总是写得更清楚 [x for x in S if P(x)]" - Guido van Rossum。
      • @Nou 我偏向于功能性的东西。同时guido真的不喜欢他们。他们有自己的位置,但可能不是针对 OP 问题
      • 您的第一个 sn-p 是 SyntaxError(我认为您的意思是 !=not 是不同的)。使用filter 并不比使用列表推导式更实用(这是我们从除了 Haskell 之外的任何其他人那里偷来的一个想法!),并且将 filtermap 与 lambdas 一起使用似乎非常愚蠢我。
      • “功能性的东西”是什么意思?你的意思是filter这个名字吗?它在语义上与列表推导式(其本身是从纯函数式语言中借用的)有何不同?
      • @Nou python 手册称它们为功能性工具,因此是功能性的东西。有时我使用它们是因为它们在某些情况下使代码更简洁。从语义上讲,这可能没有什么不同。
      【解决方案6】:

      外部for循环的主体是做什么的?

      如果它是一个函数调用,你可能会这样做:

      [f(w) for w in words if w != '']

      【讨论】:

        猜你喜欢
        • 2020-08-20
        • 2011-09-21
        • 1970-01-01
        • 2013-07-27
        • 2023-01-26
        • 1970-01-01
        • 2021-12-25
        • 2022-01-25
        • 2016-08-14
        相关资源
        最近更新 更多