-1

I am new to python and currently trying my way out on python dictionary comprehension. I am currently trying to fetch common keys and their values from a python dictionary using dictionary comprehension. I have tried few options but it doesn't seem to fetch the desired output. Could someone kindly point me to the right direction please.

input = [
    {'name': 'xxx','class':'1','grade':'A+'},
    {'name': 'yyy','class':'1','grade':'A-'},
    {'name': 'zzz','class':'2','grade':'B+'},
    {'name': 'ooo','class':'1','grade':'C+'},
    {'name': 'ppp','class':'2','grade':'C+'},
    {'name': 'sss','class':'3','grade':'A+'}
   ]

Expected output:

output = [
 {'class':'1','grade':['A+','A-','C+'],'name':['xxx','yyy','ooo']},
 {'class':'2','grade':['B+','C+'],'name':['zzz','ppp']},
 {'class':'3','grade':['A+'],'name':['sss']}
 ]
James Z
  • 12,209
  • 10
  • 24
  • 44
Pynewbie
  • 25
  • 1
  • 7

3 Answers3

0

This should get the job done:

input = [
{'name': 'xxx','class':'1','grade':'A+'},
{'name': 'yyy','class':'1','grade':'A-'},
{'name': 'zzz','class':'2','grade':'B+'},
{'name': 'ooo','class':'1','grade':'C+'},
{'name': 'ppp','class':'2','grade':'C+'},
{'name': 'sss','class':'3','grade':'A+'}
]

output = []

#This will make a new list of dictionaries 
#without the duplicate 'class' keys 
for list_item in input:
    if {'class': list_item['class']} not in output:
        output.append({"class": list_item['class']})

#This will create new keys named 'grade' and 'name'
#for every item in the new list of dictionaries
for dict_ in output:
    dict_.update({'grade': []})
    dict_.update({'name': []})
    for list_item in input:
        #This will populate the lists inside the new keys 
        #with the correct values     
        if list_item['class'] == dict_['class']:
            dict_['grade'].append(list_item['grade'])
            dict_['name'].append(list_item['name'])

print(output)
Tony
  • 266
  • 1
  • 11
0

Not sure if this is possible with a dictionary comprehension but you can do it with a basic loop iterating over the input list...

input_ = [
    {'name': 'xxx', 'class': '1', 'grade': 'A+'},
    {'name': 'yyy', 'class': '1', 'grade': 'A-'},
    {'name': 'zzz', 'class': '2', 'grade': 'B+'},
    {'name': 'ooo', 'class': '1', 'grade': 'C+'},
    {'name': 'ppp', 'class': '2', 'grade': 'C+'},
    {'name': 'sss', 'class': '3', 'grade': 'A+'}]

output_ = {}

for d in input_:
    d_ = output_.setdefault(d['class'], {'class': d['class']})
    d_.setdefault('grade', []).append(d['grade'])
    d_.setdefault('name', []).append(d['name'])

print(list(output_.values()))

Output:

[{'class': '1', 'grade': ['A+', 'A-', 'C+'], 'name': ['xxx', 'yyy', 'ooo']}, {'class': '2', 'grade': ['B+', 'C+'], 'name': ['zzz', 'ppp']}, {'class': '3', 'grade': ['A+'], 'name': ['sss']}]
DarkKnight
  • 19,739
  • 3
  • 6
  • 22
0

try this code for solving your problem which makes use of mainly list comprehensions:

input = [
    {'name': 'xxx','class':'1','grade':'A+'},
    {'name': 'yyy','class':'1','grade':'A-'},
    {'name': 'zzz','class':'2','grade':'B+'},
    {'name': 'ooo','class':'1','grade':'C+'},
    {'name': 'ppp','class':'2','grade':'C+'},
    {'name': 'sss','class':'3','grade':'A+'}
   ]

all_classes = list(set([int(i['class']) for i in input]))
all_classes  = [str(i) for i in all_classes]
print('all classes: ',all_classes)
    
result = []
for i in all_classes:
    class_dict = {'class':i,
            'grade': [j['grade'] for j in input if j['class'] == i],
            'name':  [j['name'] for j in input if j['class'] == i]
        }
    result.append(class_dict)
    
print(result)

Output

all classes:  ['1', '2', '3']
[
{'class': '1', 'grade': ['A+', 'A-', 'C+'], 'name': ['xxx', 'yyy', 'ooo']},
{'class': '2', 'grade': ['B+', 'C+'], 'name': ['zzz', 'ppp']},
{'class': '3', 'grade': ['A+'], 'name': ['sss']}]