Python中的条件计数

nic*_*aum 26 python arrays list count

不确定之前有人问过,但我找不到明显的答案.我正在尝试计算列表中等于某个值的元素数.问题是这些元素不是内置类型.所以,如果我有

class A:
    def __init__(self, a, b):
        self.a = a
        self.b = b

stuff = []
for i in range(1,10):
    stuff.append(A(i/2, i%2))
Run Code Online (Sandbox Code Playgroud)

现在我想计算其字段b = 1的列表元素.我想出了两个解决方案:

print [e.b for e in stuff].count(1)
Run Code Online (Sandbox Code Playgroud)

print len([e for e in stuff if e.b == 1])
Run Code Online (Sandbox Code Playgroud)

哪种方法最好?还有更好的选择吗?似乎count()方法不接受键(至少在Python 2.5.1版本中).

非常感谢!

Ale*_*lli 45

sum(x.b == 1 for x in L)
Run Code Online (Sandbox Code Playgroud)

一个布尔(如从比较如所得x.b == 1)也是int,具有值0False,1True,所以算术如求和工作得很好.

这是最简单的代码,但也许不是最快的(只能timeit告诉你肯定;-).考虑(简化的情况,以适应命令行,但等效):

$ py26 -mtimeit -s'L=[1,2,1,3,1]*100' 'len([x for x in L if x==1])'
10000 loops, best of 3: 56.6 usec per loop
$ py26 -mtimeit -s'L=[1,2,1,3,1]*100' 'sum(x==1 for x in L)'
10000 loops, best of 3: 87.7 usec per loop
Run Code Online (Sandbox Code Playgroud)

因此,对于这种情况,生成额外临时列表并检查其长度的"内存浪费"方法实际上比我更喜欢的更简单,更短,更节省内存的方法更快.列表值的其他组合,Python实现,在这种加速中"投入"的内存可用性等,当然可以影响确切的性能.

  • @nicolaum和@Dave,我添加了详细的解释和时间 - 实际上显示"无用列表"方法比简单方法更快(至少在一个示例中).最简单的并不总是最快:有时如果你有自由和未使用的内存,无论如何"投资"它可以是一个权衡,节省你一些时间. (2认同)
  • 虽然这是非常聪明并且是所有示例中最短的代码,但我发现它是最不可信和明显的.`len([x for L in L if cond])`是冗长的并包含一些冗余,但它的含义很明显. (2认同)

小智 15

print sum(1 for e in L if e.b == 1)
Run Code Online (Sandbox Code Playgroud)

  • 不错的一个,我认为这是Alex Martelli的答案更可读的版本,总结1比知道True可以被视为1更明显. (3认同)