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

Python 如何将项目分组到作为字典值存储的集合中?,python,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 = stude

这就是我现在的代码

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)。我支持在文本文件中循环。如果我打印出课程代码和学生ID,我会得到:

ENG002 272815
FCOM02 2113869
ECO001 2923516
MTH001 2923516
ECO001 272815
工程师001 2923516
PHY001 2949099
GEL001 2113869
INF001 2286481
工程师001 2113869
FCOM03 2923516

看起来您正在使用
更新
,您应该在哪里使用
添加

这就是你所拥有的:

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'}}

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

course\u roll\u dict.setdefault(course\u code,set()).add(student\u id)

下面是这行奇怪的代码的作用
setdefault
尝试在字典中查找键
course\u code
。如果该键不存在,它会将该键添加到字典中,并使用第二个参数(空集)作为值,该参数也会返回。如果键在那里,它只返回值。在任何一种情况下,返回的值都是到目前为止处理的学生的集合。然后,你只需将新学生添加到其中


您还可以查看标准库中的类
defaultdict

换句话说,您试图使用相同的键对元素进行分组?是的,换句话说,将dict值设置为列表(或元组或集合等),而不是单个项。如果它对您有效,请接受答案。谢谢