如何在字典中按值获取键(Python2.7)

2024-05-20 13:16:30 发布

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

我有一本描述学生课程的字典: 键是名称(字符串),值是课程列表(字符串)

students_dict={"name1":["math","computer science", "statistics"],"name2":["algebra","statistics","physics"],"name3":["statistics","math","programming"]}

我想创建一个函数来获取这个词汇表并返回一个新的词汇表: 关键是课程(字符串) 这些值将是参加这门课程的学生名单

course_students={"statistics":["name1","name2","name3"],"algebra":["name2"],"programming":["name3"],"computer science":["name1"],"physics":["name2"],"math":["name1","name3"]}

顺序无关紧要。你知道吗

编辑:这正是我想做的

   def swap_student_courses(students_dict):
students_in_each_cours={}
cours_list=[...]
cours_names=[]
for cours in cours_list:
    if students_dict.has_key(cours)==True:
        cours_names.append(...)
students_in_each_cours.append(cours_names)
return students_in_each_cours

Tags: 字符串innamesmathdictcomputer课程science
3条回答

这可以通过一个集合理解(首先得到一组唯一的课程名称)然后一个dict理解(将课程名称与一个学生列表相关联,该学生的课程出现在他们各自的列表中)来完成:

all_courses = {course for student_course_list in students_dict.values() for course in student_course_list}
course_students = {course:[student_name for student_name,student_course_list in students_dict.items() if course in student_course_list] for course in all_courses}

你尝试的方法忽略了搜索每个学生的课程列表:你使用了students_dict.has_key(cours)忘记了学生的名字,而不是课程,是students_dict的关键。你知道吗

下面是您可以使用的简单函数。你知道吗

from collections import defaultdict

def create_new_dict(old_dict):
     new_dict = defaultdict(list)
     for student, courses in old_dict.items():
         for course in courses:
             new_dict[course].append(student)
     return new_dict

python标准dict和defaultdict之间的唯一区别是,如果您尝试访问标准dict中不存在的键,它将导致KeyError,而在defaultdict中,它将该键的默认值设置为创建该dict时传递的任何内容。在本例中,它是空列表。你知道吗

不带defaultdict的实现

def create_new_dict(old_dict):
     new_dict = dict()
     for student, courses in old_dict.items():
         for course in courses:
             try:
                 new_dict[course].append(student)
             except KeyError:
                 new_dict[course] = [student]
     return new_dict

编辑

标准dict中的KeyError正在增加,因为如果这是我们第一次尝试访问某个键,'math'例如,它不在字典中。Here是很好的词典解释。你知道吗

值重复不是问题,因为在这种情况下,我们只需将新的student追加到列表中。你知道吗

为了简单起见,我会在这里使用defaultdict,但要知道,使用常规的dict也可以做到这一点:

from collections import defaultdict

students_dict={"name1":["math","computer science", "statistics"],
               "name2":["algebra","statistics","physics"],
               "name3":["statistics","math","programming"]}

course_students = defaultdict(list)

for name, course_list in students_dict.items():
    for course in course_list:
        course_students[course].append(name)

相关问题 更多 >