2015-01-14 65 views
3

如果給我一個包含學生名稱作爲鍵的字典以及他們作爲一組字符串精通的主題,我將如何去創建一個新字典會有主題作爲鑰匙,每個人都精通這些主題?Python:在切換鍵和值時創建一個新的字典

對不起,這是我第一次在這裏問一個問題,所以我不太清楚如何包含函數的片段。

回答

4

使用defaultdict使每個集合中的每個主題/值成爲一個鍵,並將每個學生追加/添加爲列表/集合作爲值。

s = {'Sherman':{'calculus', 'english'}, 
'Tyler': {'computers','history'}, 
'Kevin': {'chemistry','PE','geometry'}, 
'Joe': {'calculus','computers'}, 
'Bryan': {'nothing'}, 
'Steven': {'biology','research', 'algebra'}} 

from collections import defaultdict 
d = defaultdict(list) 
for k,v in s.items(): # iterate over key/value tuples. 
    for sub in v: # get each subject in the set/value 
     d[sub].append(k) # add the students to a list and and make each subject a key 
print(d) 

defaultdict(<type 'list'>, {'calculus': ['Sherman', 'Joe'], 'biology': ['Steven'], 'algebra': ['Steven'], 'geometry': ['Kevin'], 'computers': ['Tyler', 'Joe'], 'research': ['Steven'], 'english': ['Sherman'], 'nothing': ['Bryan'], 'chemistry': ['Kevin'], 'PE': ['Kevin'], 'history': ['Tyler']}) 

如果你想套作爲值使用defaultdict(套)及。新增的,而不是追加:如果該鍵不將添加的字典存在,

from collections import defaultdict 

d = defaultdict(set) 
for k,v in s.items(): 
    for sub in v: 
     d[sub].add(k) 
print(d) 
defaultdict(<type 'set'>, {'calculus': set(['Sherman', 'Joe']), 'biology': set(['Steven']), 'algebra': set(['Steven']), 'geometry': set(['Kevin']), 'computers': set(['Tyler', 'Joe']), 'research': set(['Steven']), 'english': set(['Sherman']), 'nothing': set(['Bryan']), 'chemistry': set(['Kevin']), 'PE': set(['Kevin']), 'history': set(['Tyler'])}) 

使用defaultdict指附加或附加的值(如果它已經存在),可以使用dict.setdefault,但defaultdict更有效。

+1

當我嘗試你的方式時,我得到了回溯說詞典沒有屬性'iteritems'。你能解釋一下你在這裏做了什麼嗎? – Tyler

+0

@泰勒,你可能正在使用python 3.使用.items()而不是 –

+1

哦,你是對的。我應該提到這一點。謝謝! – Tyler

相關問題