代码之家  ›  专栏  ›  技术社区  ›  helpermethod

列表理解和len()与simple for循环

  •  5
  • helpermethod  · 技术社区  · 14 年前

    我想出了两个可能的解决方案:

    result = 0
    for word in words:
        if len(word) >= 2 and word[0] == word[-1]:
            result += 1
    return result
    

    与。

    return len([word for word in words if len(word) >= 2 and word[0] == word[-1]])
    

    哪一个是首选的解决方案?或者还有更好的呢?

    5 回复  |  直到 14 年前
        1
  •  15
  •   mechanical_meat nazca    14 年前

    在你的第二个例子中 generator expression 如果你的单子很大的话会比单子比较好。

    sum(1 for word in words if len(word) >= 2 and word[0] == word[-1])
    
        2
  •  4
  •   jacrough    14 年前

    别忘了你的蟒蛇禅:

    提姆·彼得斯的《蟒蛇禅》

    美胜于丑。

    显式比隐式好。

    简单胜于复杂。

    平的比嵌套的好。

    稀胜于密。

    可读性很重要。

    特殊情况不足以

    尽管实用胜过纯粹。

    错误不应该悄无声息地过去。

    除非明确沉默。

    面对模棱两可,拒绝

    应该有一个——最好是 只有一个——显而易见的方法。

    尽管这种方式可能并不明显

    现在总比没有好。

    尽管从来没有比 正确的

    如果实施困难 解释一下,这是个坏主意。

    如果实现容易 解释一下,这可能是个好主意。

    --让我们做更多的这些!

        3
  •  2
  •   Martin v. Löwis    14 年前

    我个人认为显式循环更具可读性,但这很有品味(有些人通常更喜欢较短的代码,特别是在必须编写代码的情况下)。

    任何一个版本都可以进一步缩短/改进:

    result = 0
    for word in words:
        result += int(len(word) >= 2 and word[0] == word[-1])
    return result
    

    return sum(len(word) >= 2 and word[0] == word[-1] for word in words)
    

    如果你想使用len(),我会告诉读者这些值并不重要:

    len(1 for word in words if len(word) >= 2 and word[0] == word[-1])
    
        4
  •  1
  •   pyfunc    14 年前

    两个都很好。

    列表理解返回另一个您要传递到的列表 伦恩 . 第一种解决方案避免创建另一个列表。

        5
  •  1
  •   Glenn Maynard    14 年前

    您可能需要考虑的其他一些变体:

    首先,可以将筛选条件分解为函数。无论哪种情况都可以,但如果情况变得更复杂,我肯定会这样做:

    def check(word):
        return len(word) >= 2 and word[0] == word[-1]
    sum(1 for word in words if check(word))
    

    接下来,如果生成列表(如原始列表理解中所述)是可以接受的,则可以执行以下操作:

    len(filter(check, words))
    

    有itertools.ifilter,但如果使用它,则需要使用 sum 再次表达,所以它不会变得更清晰。

    这个 总和 技巧经常出现,以至于我很惊讶没有一个标准的库调用来计算迭代器中的项数(如果有的话,我还没有找到)。或者,如果 len 如果迭代器中没有 __len__