2017-05-28 29 views
2

所以這是我的代碼,現在,如何將項目分組爲存儲爲字典值的集合?

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

換句話說,你試圖用相同的密鑰來分組elemen? –

+0

是的,換句話說, –

+0

將字典值設置爲列表(或元組或集合等)而不是單個項目。 –

回答

2

字典有你需要的確切功能 - 這是setdefault。你的代碼的最後一行改成這樣:

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

下面就是這段代碼看起來怪怪的線一樣。 setdefault嘗試在字典中找到密鑰course_code。如果鍵不存在,它將鍵添加到字典中,並使用第二個參數(一個空集)作爲值,該值也會返回。如果鑰匙在那裏,它只是返回值。無論哪種情況,返回值都是迄今爲止處理的一組學生。然後,您只需將新學生添加到它。

您也可以查看標準庫中的類defaultdict

+0

謝謝你!現在更有意義了。 –

+0

如果它適合您,請接受答案。謝謝。 –

2

看起來你正在使用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}} 
1

您還可以使用groupbyitertools模塊,以解決你的問題,像這樣的例子:

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'}} 
相關問題