最短的计算方式?

时间:2015-04-11 20:58:55

标签: python count list-comprehension

假设我有MyClass的列表。我想计算MyClass.SomeProperty设置为True的元素数量(假设SomeProperty是一个总是TrueFalse的布尔值。我担心的是:

  • 它应该快速运行
  • 代码不应混淆阅读
  • 它适用于任何条件(不仅仅是布尔值)

我知道我能做到:

count = len([e for e in MyList if e.SomeProperty])  # For non booleans, something like e.SomeProperty == MyValue

但似乎效率低下。

  • 为什么要输入像e for e
  • 这样没有意义的东西?
  • 为什么要在计算它们时创建一个完整的列表?

有可能做得更好吗?

3 个答案:

答案 0 :(得分:4)

您可以将sum与生成器表达式一起使用。

count = sum( e.SomeProperty for e in MyList )

或者对于一般谓词p

count = sum( p(e) for e in MyList )

这样可以使用True和False作为整数1和0的事实,并且使用生成器这一事实将阻止创建新列表。

如果您坚持要避开for e in部分,可以使用mapattrgetter

import opertor
count = sum(map(operator.attrgetter('SomeProperty'), MyList))

或者对于一般谓词p

count = sum(map(p, MyList))

然而,这不是pythonic。我推荐第一种方法。

答案 1 :(得分:0)

当然你的意思是:

count = sum(bool(e.SomeProperty) for e in MyList)

答案 2 :(得分:0)

与其他人类似,但更多的是Pythonic imho:

sum(1 for e in MyList if e.SomeProperty)

或者如果你不在乎懒惰:

len([e for e in MyList if e.SomeProperty])