2015-01-14 4 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 (세트)를 사용하는 대신 APPEND의 .add 당신이 세트를 원하는 경우

: 키가 추가됩니다 DICT에 존재하지 않는 경우

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

@Tyler, 아마도 파이썬 3을 사용하고있을 것입니다. 대신 .items()를 사용하십시오. –

+1

오 예, 맞습니다. 나는 그것을 언급 했어야했다. 감사! – Tyler

관련 문제