'how to count duplicate of dictionarys inside the list?

Was wondering if anyone could help me with counting duplicate dictionarys. I have this list:

a = [{'key1':1, 'key2':2, 'key3':3, 'count': 0},
     {'key1':1, 'key2':2, 'key3':4, 'count': 0},
     {'key1':3, 'key2':2, 'key3':4, 'count': 0},
     {'key1':1, 'key2':2, 'key3':3, 'count': 0}]

i`m lookig to count all duplicates and once it is match remove copy and append to that dictionry ['count'] += 1. so final result might look like

a = [{'key1':1, 'key2':2, 'key3':3, 'count': 2},
     {'key1':1, 'key2':2, 'key3':4, 'count': 0},
     {'key1':3, 'key2':2, 'key3':4, 'count': 0}]

i did tryed simple aprouch such as which didnt worked:

a = [{'key1':1, 'key2':2, 'key3':3, 'count': 0},
     {'key1':1, 'key2':2, 'key3':4, 'count': 0},
     {'key1':3, 'key2':2, 'key3':4, 'count': 0},
     {'key1':1, 'key2':2, 'key3':3, 'count': 0}]

for i in range(len(a)):
     for n in range(len(a)):
          if a[i]['key1'] == a[n]['key1'] and a[i]['key2'] == a[n]['key2'] and a[i]['key3'] == a[n]['key3']:
               a[i]['count'] += 1

               del a[n]

was thinking aswell there should be some simpler aprouch. thanks



Solution 1:[1]

You can leverage Counter method in the collections module.

import collections
count = collections.Counter([tuple(d.items()) for d in a])
[dict(k) | {c:v} for (*k, (c,_)), v in count.items()]

this looks like:

[{'key1': 1, 'key2': 2, 'key3': 3, 'count': 2},
 {'key1': 1, 'key2': 2, 'key3': 4, 'count': 1},
 {'key1': 3, 'key2': 2, 'key3': 4, 'count': 1}]

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1