Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Count the duplicates in a list of tuples

I have a list of tuples: a = [(1,2),(1,4),(1,2),(6,7),(2,9)] I want to check if one of the individual elements of each tuple matches the same position/element in another tuple, and how many times this occurs.

For example: If only the 1st element in some tuples has a duplicate, return the tuple and how many times it's duplicated. I can do that with the following code:

a = [(1,2), (1,4), (1,2), (6,7), (2,9)]

coll_list = []
for t in a:
    coll_cnt = 0
    for b in a:
        if b[0] == t[0]:
            coll_cnt = coll_cnt + 1
    print "%s,%d" %(t,coll_cnt)
    coll_list.append((t,coll_cnt))

print coll_list

I want to know if there is a more effective way to do this?

like image 388
DimSarak Avatar asked Jul 03 '15 13:07

DimSarak


1 Answers

You can use a Counter

from collections import Counter
a = [(1,2),(1,4),(1,2),(6,7),(2,9)]
counter=Counter(a)
print counter

This will output:

Counter({(1, 2): 2, (6, 7): 1, (2, 9): 1, (1, 4): 1})

It is a dictionary like object with the item (tuples in this case) as the key and a value containing the number of times that key was seen. Your (1,2) tuple is seen twice, while all others are only seen once.

>>> counter[(1,2)]
2

If you are interested in each individual portion of the tuple, you can utilize the same logic for each element in the tuple.

first_element = Counter([x for (x,y) in a])
second_element = Counter([y for (x,y) in a])

first_element and second_element now contain a Counter of the number of times values are seen per element in the tuple

>>> first_element
Counter({1: 3, 2: 1, 6: 1})
>>> second_element
Counter({2: 2, 9: 1, 4: 1, 7: 1})

Again, these are dictionary like objects, so you can check how frequent a specific value appeared directly:

>>> first_element[2]
1

In the first element of your list of tuples, the value 2 appeared 1 time.

like image 78
Andy Avatar answered Oct 02 '22 04:10

Andy