Сортировка JSON по значению - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь проанализировать следующий отчет JSON о студентах, используя Python

{
    "report":[
        {
            "enrollment": "rit2011001",
            "name": "Julia",
            "subject":[
                {
                    "code": "DSA",
                    "grade": "A"
                }
            ]
        },
        {
            "enrollment": "rit2011020",
            "name": "Samantha",
            "subject":[
                {
                    "code": "COM",
                    "grade": "B"
                },
                {
                    "code": "DSA",
                    "grade": "A"
                }
            ]
        }
    ]
}

Так, чтобы отчет был упорядочен по возрастанию сначала по коду, затем по классу и затем по зачислению. Вот как должен быть вывод

COM B rit2011020 Samantha
DSA A rit2011001 Julia
DSA A rit2011020 Samantha

Вот мой неполный фрагмент кода, с которым мне нужна помощь:

import json

data='''{
    "report":[
        {
            "enrollment": "rit2011001",
            "name": "Julia",
            "subject":[
                {
                    "code": "DSA",
                    "grade": "A"
                }
            ]
        },
        {
            "enrollment": "rit2011020",
            "name": "Samantha",
            "subject":[
                {
                    "code": "COM",
                    "grade": "B"
                },
                {
                    "code": "DSA",
                    "grade": "A"
                }
            ]
        }
    ]
}'''

print data  #for debug
parsed_json = json.loads(data)
print parsed_json #for debug
for key,value in sorted(parsed_json.items()):
    print key,value

Я не знаю, как применить последовательную фильтрацию для достижения результата.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Если вы хотите использовать очень популярную внешнюю библиотеку для анализа данных, вы можете использовать pandas с json_normalize(), например ::

In []:
from pandas.io.json import json_normalize

df = json_normalize(parsed_json['report'], 'subject', ['enrollment', 'name'])
df.sort_values(['code', 'grade', 'enrollment']).reset_index(drop=True)

Out[]:
  code grade  enrollment      name
0  COM     B  rit2011020  Samantha
1  DSA     A  rit2011001     Julia
2  DSA     A  rit2011020  Samantha
0 голосов
/ 15 января 2019

Попробуйте использовать вложенный цикл с print:

import json
data='''{
    "report":[
        {
            "enrollment": "rit2011001",
            "name": "Julia",
            "subject":[
                {
                    "code": "DSA",
                    "grade": "A"
                }
            ]
        },
        {
            "enrollment": "rit2011020",
            "name": "Samantha",
            "subject":[
                {
                    "code": "COM",
                    "grade": "B"
                },
                {
                    "code": "DSA",
                    "grade": "A"
                }
            ]
        }
    ]
}'''
print data  #for debug
parsed_json = json.loads(data)
print parsed_json #for debug
for i in parsed_json['report']:
    for x in i['subject']:
        print x['code'],x['grade'],i['enrollment'],i['name']

Выход:

DSA A rit2011001 Julia
COM B rit2011020 Samantha
DSA A rit2011020 Samantha

Если заботиться о порядке кадра:

import json
data='''{
    "report":[
        {
            "enrollment": "rit2011001",
            "name": "Julia",
            "subject":[
                {
                    "code": "DSA",
                    "grade": "A"
                }
            ]
        },
        {
            "enrollment": "rit2011020",
            "name": "Samantha",
            "subject":[
                {
                    "code": "COM",
                    "grade": "B"
                },
                {
                    "code": "DSA",
                    "grade": "A"
                }
            ]
        }
    ]
}'''
print data  #for debug
parsed_json = json.loads(data)
print parsed_json #for debug
l=[]
for i in parsed_json['report']:
    for x in i['subject']:
        l.append(' '.join([x['code'],x['grade'],i['enrollment'],i['name']]))
print('\n'.join(sorted(l)))
...