not sure this was asked before, but I couldn’t find an obvious answer. I’m trying to count the number of elements in a list that are equal to a certain value. The problem is that these elements are not of a built-in type. So if I have
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))
Now I would like a count of the list elements whose field b = 1. I came up with two solutions:
print [e.b for e in stuff].count(1)
and
print len([e for e in stuff if e.b == 1])
Which is the best method? Is there a better alternative? It seems that the count() method does not accept keys (at least in Python version 2.5.1.
Many thanks!
A boolean (as resulting from comparisons such as
x.b == 1) is also anint, with a value of0forFalse,1forTrue, so arithmetic such as summation works just fine.This is the simplest code, but perhaps not the speediest (only
timeitcan tell you for sure;-). Consider (simplified case to fit well on command lines, but equivalent):So, for this case, the “memory wasteful” approach of generating an extra temporary list and checking its length is actually solidly faster than the simpler, shorter, memory-thrifty one I tend to prefer. Other mixes of list values, Python implementations, availability of memory to “invest” in this speedup, etc, can affect the exact performance, of course.