2012-07-18 53 views
5

私はjsonデータから作成した大きなpython dictを持っていて、大きなものから小さな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ためのデータを取得しています方法です:

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

大きな辞書エントリの1つは、何の詳細を持っていないとき、私はしかし、キーエラーが発生します。私はDefaultDictモジュールを使用する必要があると言っているのでしょうか、それとも簡単な方法がありますか?

答えて

2

d[key] = vとしてdictに割り当てると、デフォルト値のためd.get(k, 'Not available')を使用することができ、デフォルト値を供給するget(key, defaultVar)メソッドを使用します'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を使用できます。そうしないと、単に「利用できません」(または何でも)したい場合は、その後、あなただけの

関連する問題