0

I have a list of dicts (same format) like this :

L =  [
        {'id': 1, 'name': 'john', 'age': 34},
        {'id': 1, 'name': 'john', 'age': 34},
        {'id': 2, 'name': 'hanna', 'age': 30},
        {'id': 2, 'name': 'hanna', 'age': 30},
        {'id': 3, 'name': 'stack', 'age': 40}
    ]

I want to remove duplication and get the number of this duplication like this

[
    {'id': 1, 'name': 'john', 'age': 34, 'duplication': 2},
    {'id': 2, 'name': 'hanna', 'age': 30, 'duplication': 2},
    {'id': 3, 'name': 'stack', 'age': 40, 'duplication': 1}
]

I already managed to remove the duplication by using a set.... but I can't get the number of duplications

my code :

no_duplication = [dict(s) for s in set(frozenset(d.items()) for d in L)]
            
no_duplication =  [
                   {'id': 1, 'name': 'john', 'age': 34},
                   {'id': 2, 'name': 'hanna', 'age': 30},
                   {'id': 3, 'name': 'stack', 'age': 40}
                  ]

2 Answers2

1

Here is a solution you can give a try using collections.Counter,

from collections import Counter

print([
    {**dict(k), "duplicated": v}
    for k, v in Counter(frozenset(i.items()) for i in L).items()
])

[{'age': 34, 'duplicated': 2, 'id': 1, 'name': 'john'},
 {'age': 30, 'duplicated': 2, 'id': 2, 'name': 'hanna'},
 {'age': 40, 'duplicated': 1, 'id': 3, 'name': 'stack'}]
sushanth
  • 8,275
  • 3
  • 17
  • 28
0
 ar = [
    {'id': 1, 'name': 'john', 'age': 34},
    {'id': 1, 'name': 'john', 'age': 34},
    {'id': 2, 'name': 'hanna', 'age': 30},
    {'id': 2, 'name': 'hanna', 'age': 30},
    {'id': 3, 'name': 'stack', 'age': 40}
]

br = []
cnt = []

for i in ar:
    if i not in br:
        br.append(i)
        cnt.append(1)
    else:
        cnt[br.index(i)] += 1

for i in range(len(br)):
    br[i]['duplication'] = cnt[i]

The desired output is contained in br as:

[
 {'id': 1, 'name': 'john', 'age': 34, 'duplication': 2}, 
 {'id': 2, 'name': 'hanna', 'age': 30, 'duplication': 2}, 
 {'id': 3, 'name': 'stack', 'age': 40, 'duplication': 1}
]
edusanketdk
  • 602
  • 1
  • 6
  • 11