Pythonで辞書をforで作成するときに、キーがー存在する場合はバリューを更新して、存在しない場合はキー:バリューを追加したい場合、標準ライブラリのdefaultdictを使うのが良い。

例えば次のようなファイルががあって、

Shinji,国語,100
Shinji,英語,95
Shinji,歴史,92
Aska,独語,100
Aska,国語,75
Aska,数学,87
Rey,国語,87
Rey,歴史,92
Rey,数学,78

ファイルから次のような辞書を作りたいとする。

{
 'Shinji': {'英語': '95', '歴史': '92', '国語': '100'},
 'Rey': {'数学': '78', '歴史': '92', '国語': '87'},
 'Aska': {'独語': '100', '数学': '87', '国語': '75'}
}

read_csv というファイルオブジェクトを for で処理するとき(ファイル読み込み部分は割愛)、辞書:examに当該キーが無い状態で .updateすると KeyErrorになってしまう。キーがあるかどうかを調べて分岐させるやりかたでもうまくいくが、

exam = {}
for row in read_csv:
    name = row[0]
    subject = row[1]
    score = row[2]

    if name in exam:
        exam[name].update({subject:score})
    else:
        exam[name] = {subject:score}

これしきのことでifを書きたくないなぁと思う。(本論ではないが has_key() はPython3から削除されている)

調べると .setdefault とか .get を使う方法も出てくるが、defaultdictを使うともっとスマートに書ける。

from collenctions import defaultdict

exam = defaultdict(dict)
for row in read_csv:
    name = row[0]
    subject = row[1]
    score = row[2]

    exam[name].update({subject:score})

easy.