1. TOP
  2. プログラム
  3. ソフト
  4. python
  5. Python-エッセンシャルー7

Python-エッセンシャルー7

もっと複雑

辞書の値がlistのようなもっと複雑な型ならどうでしょうか。例えば、
投票数を数えるだけでなく、誰がそのパンに投票したかも知りたい。
votes = {
'baguette':['Bob', 'Alice']
'ciabatta':['Coco', 'Deb']
}
key = 'brioche'
who = 'Elmer'

in式

キーがある場合には2回のアクセス、ない場合には1回のアクセスと1回
の代入が必要です。この例は、一つ前のカウントの例と異なり、キーが存在
しない場合には空リストを代入しなければいけないところが異なります。
3重代入によって、2行ではなく1行でキーを追加します。
辞書にデフォルト値が挿入されたら、listがその後のappendの呼び出しで
変更されるため、再度代入する必要はありません。

KeyError

を使うことも可能です。、これはキーがあれば1回のアクセス、なければ
1回のアクセスと一回の代入なので、in条件の場合よりも効率的です。
try:
names = votes[key]
except keyEroor:
votes[key] = names = []
names.append(who)

getを使う

getメソッドで、キーがあればlist値を取得、なければ1回アクセスと
1回の代入を行うこともできます。
name = votes.get(key)
if names is None:
__votes[key] = names = []
names.append(who)

さらに向上

if文で代入すれば、さらに一業短縮できる。

if (names := vote.get(key)) is None:
__votes[key] = names = []
name.append(who)

setdefaultメソッド

dict型には、このパターンの処理をさらに簡潔に書けるsetdefaultメソッド
もあります。これは、辞書のキー値を取得しようとします。キーがないと
このメソッドはそのキーに対して指定されたデフォルト値を割りあて、
メソッドはそのキーを返します。それは、元々あったキー値が新たに挿入
されたデフォルト値のどちらかです。
name = votes.setdefault(key, [])
names.append(who)

これは期待どうりに動作し、getに代入式を使った場合よりも短くなっています
しかし、この方式は読みやすくありません。メソッド名setdefaultが目的を

混乱せせます。値を取得しているのに、どうしてsetなのでしょうか。
get_or_setという名前でないのはなぜでしょうか、
要点は、、このコードを初めて見る、Pythonに詳しくない人には、setdefaultが
自明でないため、何をしようとしているのかわからないのではないかと心配に
なります。
もう一つ重要なことがあります。setdefault値は欠損キーの場合には辞書に
複製されるのではなく、直接代入されます。

これはsetdefaultでアクセスする場合は、どんなキーであっても新たなデフォル
ト値を作成しておかなければ、ということです。setdefaultを呼び出す旅に作成
するので、パフォマンス上大きなオーバーヘッドになってしまいます。