2016-11-28 99 views
1

我有這個字典描述學生的課程: 的鍵名(字符串)和值是課程(串)的名單如何通過值在字典(Python 2.7版)獲得鑰匙

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

我要創建一個得到這個dictionery並返回一個新的功能: 鍵將成爲課程(串) 和值會是誰走這條路(srtings列表)

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 
+4

你不是在尋求幫助,而是在要求我們爲你寫點東西。請儘量減少並嘗試自己解決。 –

+0

歡迎來到[so]。既然你是Stack Overflow的新手,我可以建議你訪問[help]和[ask]嗎?由於您是Python的新手,我可能建議您訪問,閱讀並遵循整個[Python教程](https://docs.python.org/2.7/tutorial/)?通過本教程的工作將允許您回答自己的問題。 –

+0

告訴我們你卡在哪裏以及爲什麼(即你預期發生什麼,實際發生了什麼)。然後堆棧溢出可以幫助你。 – jez

回答

3

我會用這裏defaultdict爲簡單起見,但要知道,你也能完成同樣一個普通字典:

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) 
0

它可以通過一組理解(首先獲得一組獨特的課程名稱),然後是一個詞典理解(將課程名稱與該課程出現在其各自列表中的學生列表相關聯):

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鑰匙。

0

以下是您可以使用的簡單功能。

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標準字典和defaultdict之間的唯一區別是,如果您嘗試訪問標準的字典不存在的話,它就會導致KeyError而defaultdict它將爲關鍵,任何對通過設置默認值該字典的創建。在我們的例子中是空的列表。

實現無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 

編輯----

的KeyError異常在標準字典提高,因爲如果這是我們第一次嘗試訪問一些關鍵的,'math'爲例,它是不在字典裏。 Here是字典的絕佳解釋。

值不重複,因爲在這種情況下,我們只需將新學生追加到列表中。

+0

你能解釋我爲什麼這是一個關鍵的錯誤? 並不是一個val-s r重複的問題嗎? –

+0

回答編輯。 – Quba