Counting the amount of occurrences in a list of tuples
Maybe collections.Counter
could solve your problem:
from collections import CounterCounter(elem[0] for elem in list1)
returns
Counter({'12392': 2, '7862': 1})
It is fast since it iterates over your list just once. You iterate over entries and then try to get a count of these entries within your list. That cannot be done with .count
, but might be done as follows:
for entry in list1: print(sum(1 for elem in list1 if elem[0] == entry[0]))
But seriously, have a look at collections.Counter
.
EDIT: I actually need the total amount of entries which has a value more than 1.
You can still use the Counter
:
c = Counter(elem[0] for elem in list1)sum(v for k, v in c.iteritems() if v > 1)
returns 2
, i.e. the sum of counts that are higher than 1.
list1.count(entry[0])
will not work because it looks at each of the three tuples in list1
, eg. ('12392', 'some string', 'some other string')
and checks if they are equal to '12392'
for example, which is obviously not the case.
@eurmiro's answer shows you how to do it with Counter
(which is the best way!) but here is a poor man's version to illustrate how Counter
works using a dictionary and the dict.get(k, [,d])
method which will attempt to get a key (k
), but if it doesn't exist it returns the default value instead (d
):
>>> list1 = [ ('12392', 'some string', 'some other string'), ('12392', 'some new string', 'some other string'), ('7862', None, 'some other string')]>>> d = {}>>> for x, y, z in list1: d[x] = d.get(x, 0) + 1>>> d{'12392': 2, '7862': 1}
I needed some extra functionality that Counter didn't have. I have a list of tuples that the first element is the key and the second element is the amount to add. @jamylak solution was a great adaptation for this!
>>> list = [(0,5), (3,2), (2,1), (0,2), (3,4)]>>> d = {}>>> for x, y in list1: d[x] = d.get(x, 0) + y>>> d{0: 7, 2: 1, 3: 6}