Home > front end >  Count dictionary value frequencies in a list of dictionaries
Count dictionary value frequencies in a list of dictionaries

Time:02-03

Hi there I have the list of dictionary and want to count value and give a key each dictionary help me please

[
{
    'language1': 'C  ',
    'language2': 'PHP',
    'language3': 'Python',
    'language4': 'Java'
},
{
    'language1': 'PHP',
    'language2': 'C  ',
    'language3': 'Java',
    'language4': 'Python'
},
{
    'language1': 'Python',
    'language2': 'Java',
    'language3': 'C  ',
    'language4': 'PHP'
},
{
    'language1': 'Java',
    'language2': 'Python',
    'language3': 'C  ',
    'language4': 'PHP'
},
{
    'language1': 'Python',
    'language2': 'C  ',
    'language3': 'Python',
    'language4': 'Java'
}]

the what I want to get : something like this

{
 'language1':{'C  ':1, 'Python':2, 'PHP':1,'Java':1},
 'language2':{'C  ':2, 'Python':1, 'PHP':1,'Java':1},
 'language3':{'C  ':2, 'Python':2, 'PHP':0,'Java':1},
 'language4':{'C  ':0, 'Python':1, 'PHP':2,'Java':2}
}

CodePudding user response:

Since you want to count the number of times each language appears in each position in a ranking, we can use dict.setdefault (which allows to set a default value if a key doesn't exist in a dict yet) to set a default dictionary of zero values to each language rank as we iterate over the list and walk the dicts.

The idea is to initialize a dictionary that maps language names to 0s (using dict.fromkeys) and in every iteration, if a language exists in some position, then add the number corresponding to the language by one in the inner dictionary.

out = {}
for d in lst:
    for num, language in d.items():
        out.setdefault(num, dict.fromkeys(lst[0].values(), 0))
        out[num][language]  = 1

Output:

{'language1': {'C  ': 1, 'PHP': 1, 'Python': 2, 'Java': 1},
 'language2': {'C  ': 2, 'PHP': 1, 'Python': 1, 'Java': 1},
 'language3': {'C  ': 2, 'PHP': 0, 'Python': 2, 'Java': 1},
 'language4': {'C  ': 0, 'PHP': 2, 'Python': 1, 'Java': 2}}

CodePudding user response:

Basically enke's answer, but with defaultdict and Counter.

from collections import Counter, defaultdict

result = defaultdict(Counter)
for d in data:
    for k, v in d.items():
        result[k].update([v])     

Note that Counters return 0 for missing keys, e.g.

>>> Counter()['C  ']
0
  •  Tags:  
  • Related