0

我需要创建一个字典,其键是唯一的课程代码,其值是具有单个键值对的字典,按字母顺序描述该课程代码可用的部分,以及属于特定部分的 ID 号,按升序排列。

数据来自名为 student_data 的字典,如下所示:

student_data[:3]

>>>[{'enlistment': [{'course code': 'UK 60', 'section': 'A'}, 
{'course code': 'GF 24', 'section': 'B'}, 
{'course code': 'ME 40', 'section': 'B'}, 
{'course code': 'VY 44', 'section': 'D'}, 
{'course code': 'EN 94', 'section': 'B'}], 
'id': '201001', 'paid': True, 'school': 'SOSE', 'year level': 2}, 
{'enlistment': [{'course code': 'EQ 61', 'section': 'D'}, 
{'course code': 'UZ 22', 'section': 'B'}, 
{'course code': 'KS 36', 'section': 'B'}, 
{'course code': 'VH 63', 'section': 'A'}, 
{'course code': 'IW 81', 'section': 'C'}], 
'id': '211002', 'paid': True, 'school': 'JGSOM', 'year level': 1}, 
{'enlistment': [{'course code': 'WE 15', 'section': 'D'}, 
{'course code': 'ZP 68', 'section': 'A'}, 
{'course code': 'GI 78', 'section': 'A'}, 
{'course code': 'GK 72', 'section': 'C'}, 
{'course code': 'FA 24', 'section': 'D'}, 
{'course code': 'UJ 28', 'section': 'A'}], 
'id': '201003', 'paid': True, 'school': 'JGSOM', 'year level': 2}]

所需输出的格式:

{
    course_code: [{
        "section": section_letter,
        "class list": [
           id_number_1,
           id_number_2,
           id_number_3,
        ]
    }
    course_code: [{
        "section": section_letter,
        "class list": [
           id_number_1,
           id_number_2,
           id_number_3,
        ]
    }
]
}

我目前的代码看起来像这样,但这仅包含每个课程代码的部分。我还需要在每个课程代码的每个部分下获取 ID 号。有谁知道如何通过修改下面的代码来做到这一点?

courses = {}

for i in student_data:
    for j in i['enlistment']:
        if j['course code'] not in courses:
            courses[j['course code']] = {'sections':[j['section']]}
        else:
            if j['section'] not in courses[j['course code']]['sections']:
                courses[j['course code']]['sections'].append(j['section']) 

for i in courses.keys():
    courses[i]['sections'] = sorted(courses[i]['sections'])

请帮忙

4

1 回答 1

-1

这将做你想要的。您建议的输出格式并不是很有用;每门课程都应该有一个字典,而不是一个对象列表,其中部分 ID 作为键,类列表作为值。这实际上是我先构建的,然后对其进行改造:

student_data = [
{'enlistment': [{'course code': 'UK 60', 'section': 'A'},
{'course code': 'GF 24', 'section': 'B'},
{'course code': 'ME 40', 'section': 'B'},
{'course code': 'VY 44', 'section': 'D'},
{'course code': 'EN 94', 'section': 'B'}],
'id': '201001', 'paid': True, 'school': 'SOSE', 'year level': 2},
{'enlistment': [{'course code': 'EQ 61', 'section': 'D'},
{'course code': 'UZ 22', 'section': 'B'},
{'course code': 'KS 36', 'section': 'B'},
{'course code': 'VH 63', 'section': 'A'},
{'course code': 'IW 81', 'section': 'C'}],
'id': '211002', 'paid': True, 'school': 'JGSOM', 'year level': 1},
{'enlistment': [{'course code': 'WE 15', 'section': 'D'},
{'course code': 'ZP 68', 'section': 'A'},
{'course code': 'GI 78', 'section': 'A'},
{'course code': 'GK 72', 'section': 'C'},
{'course code': 'FA 24', 'section': 'D'},
{'course code': 'UJ 28', 'section': 'A'}],
'id': '201003', 'paid': True, 'school': 'JGSOM', 'year level': 2}]

courses = {}

for i in student_data:
    for j in i['enlistment']:
        if j['course code'] not in courses:
            courses[j['course code']] = {}
        if j['section'] not in courses[j['course code']]:
            courses[j['course code']][j['section']] = []
        courses[j['course code']][j['section']].append( i['id'] )

from pprint import pprint

for cc,it in courses.items():
    courses[cc] = list( { 'section': k, 'class_list': v } for k,v in it.items() )

pprint(courses)

输出:

{'EN 94': [{'class_list': ['201001'], 'section': 'B'}],
 'EQ 61': [{'class_list': ['211002'], 'section': 'D'}],
 'FA 24': [{'class_list': ['201003'], 'section': 'D'}],
 'GF 24': [{'class_list': ['201001'], 'section': 'B'}],
 'GI 78': [{'class_list': ['201003'], 'section': 'A'}],
 'GK 72': [{'class_list': ['201003'], 'section': 'C'}],
 'IW 81': [{'class_list': ['211002'], 'section': 'C'}],
 'KS 36': [{'class_list': ['211002'], 'section': 'B'}],
 'ME 40': [{'class_list': ['201001'], 'section': 'B'}],
 'UJ 28': [{'class_list': ['201003'], 'section': 'A'}],
 'UK 60': [{'class_list': ['201001'], 'section': 'A'}],
 'UZ 22': [{'class_list': ['211002'], 'section': 'B'}],
 'VH 63': [{'class_list': ['211002'], 'section': 'A'}],
 'VY 44': [{'class_list': ['201001'], 'section': 'D'}],
 'WE 15': [{'class_list': ['201003'], 'section': 'D'}],
 'ZP 68': [{'class_list': ['201003'], 'section': 'A'}]}
于 2021-07-26T06:09:28.643 回答