2012-07-18 17 views
5

json 데이터에서 생성 된 큰 파이썬 사전을 가지고 있으며, 큰 파이썬 사전에서 작은 dict을 생성하고 있습니다. 큰 사전의 일부 요소에는 '세부 정보'라는 키가 있고 일부 요소에는 키가 없습니다. 내가하고 싶은 일은 큰 사전의 각 엔트리에 키가 있는지 확인하고 그렇지 않은 경우 키 'details'에 'No details available'값을 새 사전에 추가합니다. 아래 예제 코드를 데모로 사용하고 있습니다. LargeDict는 코드의 많은 키들로 훨씬 더 커지지 만, 명확성을 위해 간단하게 유지하고 있습니다.사전에 키가 있는지 확인하십시오. 그렇지 않다면 추가하십시오.

LargeDict = {'results': 
[{'name':'john','age':'23','datestart':'12/07/08','department':'Finance','details':'Good Employee'}, 
{'name':'barry','age':'26','datestart':'25/08/10','department':'HR','details':'Also does payroll'}, 
{'name':'sarah','age':'32','datestart':'13/05/05','department':'Sales','details':'Due for promotion'}, 
{'name':'lisa','age':'21','datestart':'02/05/12','department':'Finance'}]} 

이 내가 SmallDict에 대한 데이터를 얻고 방법은 다음과 같습니다 큰 DICT 항목 중 하나는 더 세부 사항이없는 경우

SmallDict = {d['name']:{'department':d['department'],'details':d['details']} for d in LargeDict['results']} 

내가 그러나 키 오류가 발생합니다. 내가 올바르게 DefaultDict 모듈을 사용해야한다고 말하는 것이 더 쉬운가?

답변

2

사용 get(key, defaultVar) 방법에 대한 d.get(k, 'Not available')을 사용할 수 있습니다 'details' 키가없는 경우 :

SmallDict = {d['name']:{'department':d['department'],'details':d.get('details','No details available')} for d in LargeDict['results']} 
13

collections.defaultdict은 필요하지 않습니다. 사전 개체의 setdefault 메서드를 사용할 수 있습니다. 다른 사람이 언급 한 것처럼 당신이 사전에 키를 추가하지 않으려면

d = {} 
bar = d.setdefault('foo','bar') #returns 'bar' 
print bar # bar 
print d #{'foo': 'bar'} 

는, 당신은 get 방법을 사용할 수 있습니다.

여기 제가 자주 보게되는 오래된 reference입니다.

+0

1 dict.setdefault (워드 프로세서)() : "키가 사전에있는 경우 그렇지 않은 경우, 그 값을 돌려 줄 기본 및 반환 값으로 키를 삽입합니다. 기본값이며 기본값은 없음입니다. " – heltonbiker

+0

예. 이것을 사용하십시오. defaultdict는 부주의 한 사람을위한 사악한 생물이다. – javadba

+1

FWIW, 나는'defaultdict'가 훌륭하다고 생각합니다. 주로, 다른 소스에서 얻은 정규 dict을'defaultdict '로 변환하는 것이 가치 있다고 생각하지 않습니다. 'defaultdict'의 "악마"는 단순히'default_factory' 속성을'None'으로 설정함으로써 회피 될 수 있습니다 (이것은 다시 한번 일반 dict처럼 행동하게합니다). – mgilson

4

dict에 항목을 자동으로 만들려면 collections.defaultdict을 사용할 수 있습니다. 당신이하지, 그냥이 (무엇이든 또는) "사용할 수 없음"하려는 경우에는, 당신은 단지 d[key] = vdict로 지정하고 기본 값을 제공하는 기본값

관련 문제