Conditional counting in Python

Viewed 41742

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!

5 Answers

Given the input

name = ['ball', 'jeans', 'ball', 'ball', 'ball', 'jeans']
price = [1, 4, 1, 1, 1, 4]
weight = [2, 2, 2, 3, 2, 2]

First create a defaultdict to record the occurrence

from collections import defaultdict
occurrences = defaultdict(int)

Increment the count

for n, p, w in zip(name, price, weight):
    occurrences[(n, p, w)] += 1

Finally count the ones that appear more than once (True will yield 1)

print(sum(cnt > 1 for cnt in occurrences.values())
Related