如何将项分组到作为字典值存储的集合中?

2024-06-26 13:36:39 发布

您现在位置:Python中文网/ 问答频道 /正文

所以这是我现在的密码

def course_rolls(records):
    """Returns course code as a key and then the
    student id as the value of the key"""
    course_roll_dict = {}
    for (course, student) in records:
        course_code = course[0]
        student_id = student[0]
        course_roll_dict.update({course_code:{student_id}})

我的输出是

{'ENG002': {2721815},
 'FCOM02': {2113869},
 'ECO001': {2721815},
 'MTH001': {2923516},
 'ENG001': {2113869},
 'PHY001': {2949099},
 'GEL001': {2113869},
 'INF001': {2286481},
 'FCOM03': {2923516}}

但这不是我想要的,我需要的

{'ECO001': {2923516, 2721815},
 'ENG002': {2721815},
 'FCOM03': {2923516},
 'GEL001': {2113869},
 'FCOM02': {2113869},
 'PHY001': {2949099},
 'ENG001': {2923516, 2113869},
 'MTH001': {2923516},
 'INF001': {2286481}}

我只是不知道如何给一个键2个值,因为有两个相同的键,但两个不同的值(或学生ID的你可以说)。我支持循环浏览文本文件。如果我打印出课程代码和学号,我会得到:

ENG002 2721815
FCOM02 2113869
ECO001 2923516
MTH001 2923516
ECO001 2721815
ENG001 2923516
PHY001 2949099
GEL001 2113869
INF001 2286481
ENG001 2113869
FCOM03 2923516

Tags: theidcodestudentrecordscoursefcom03inf001
3条回答

字典有你需要的确切功能-它是setdefault。将代码的最后一行更改为:

course_roll_dict.setdefault(course_code, set()).add(student_id)

下面是这行奇怪的代码的作用。setdefault尝试在字典中查找键course_code。如果键不在那里,它会将键添加到字典中,并使用第二个参数(一个空集)作为值,该值同时返回。如果键在那里,它只返回值。无论哪种情况,返回值都是迄今为止处理的学生的集合。然后你就把新学生加进去。你知道吗

您还可以查看标准库中的类defaultdict。你知道吗

看起来您正在使用update,而您应该使用add

这就是你所拥有的:

In [11]: my_dict = {"a": set((1,)), "b": set((2,))}

In [12]: my_dict.update({"a":set((3,))})

In [13]: my_dict
Out[13]: {'a': {3}, 'b': {2}}

这就是你想要的:

In [14]: my_dict = {"a": set((1,)), "b": set((2,))}

In [15]: my_dict["a"].add(3)

In [16]: my_dict
Out[16]: {'a': {1, 3}, 'b': {2}}

您还可以使用来自itertools模块的groupby来解决您的问题,如以下示例:

from itertools import groupby

with open("my_file", 'r') as f:
    data = [k.split() for k in f.read().splitlines()]

course_roll_dict = {}

for k,v in groupby(sorted(data), lambda x: x[0]):
    course_roll_dict[k] = set(j[1] for j in v)

print(course_roll_dict)

输出:

{'ENG001': {'2113869', '2923516'}, 'FCOM03': {'2923516'}, 'INF001': {'2286481'}, 'ECO001': {'2721815', '2923516'}, 'ENG002': {'2721815'}, 'GEL001': {'2113869'}, 'FCOM02': {'2113869'}, 'PHY001': {'2949099'}, 'MTH001': {'2923516'}}

相关问题 更多 >