008.Pythonの辞書の初期化1
初回:2018/09/26
0.今回のまとめ
dict(辞書型)の初期値について、検討してみます。 空の辞書を定義して、存在しないキーで値を取り出す場合の方法を、色々と探っていきます。
1.今までの反省
001.ツンデレ Python(パイソン)で書いたように、愚痴を書きたいがためのコラムのつもりが、 ここ、何回かは、ほとんど言語解説書的な、文章になっていました。 というか、文章というより、ソースと実行結果、みたいな感じです。 それを反省して、今回は、ちょっと初心に戻って、コラム色を強めていきたいと思います。
「コラム色って、何?」(※1)
まあ、一言でいうと、ソースコードより、文章を多く書きましょう、ということです。
「なーんだ、つまんないの」(※2)
2.辞書型の初期設定
空の辞書を定義します。
>>> x = {}
未定義のキーで、値を取り出してみましょう。
>>> x['a']
「そんなの、判るわけないでしょ」(※3)
当たり前ですが、未定義のキーでは、値を取り出せないのですが、 エラーになります。これは結構困ります。null (Pythonでは、None)を 返してくれないと、いちいち、try-except文 (※4)を使う必要があります。
辞書から、値を取り出す方法に、get関数があります。
>>> y=x.get('a')
>>> print(y)
None
>>>
これなら、'a' というキーに値がなければ、None が返されるので、簡単です。
値がない場合に、初期値を返したい場合があります。 get関数の第2引数は、値がない場合の初期値を返すことができます。
>>> y=x.get('x','AAA')
>>> print(y)
AAA
>>>
もう一つ、Pythonまには、3項演算子というのがあります。 (変数) = (条件がTrueのときの値) if (条件) else (条件がFalseのときの値)
>>> y='AAA' if( x.get('a') is None ) else x.get('a')
>>> print(y)
AAA
>>>
なんか、ぱっとしませんね。
「あなたより、ましでしょ」(※5)
キーが設定されていても、値が None の場合に、初期値を返していますが、 そもそも、キーがあるかないかを判定して、ない場合だけ、初期値を返す場合は、 in 演算子と、keys関数をを使用します。
>>> y='AAA' if( 'a' not in x.keys() ) else x.get('a')
>>> print(y)
AAA
>>>
>>> x={'a':None}
>>> y='AAA' if( 'a' not in x.keys() ) else x.get('a')
>>> print(y)
None
>>>
さらに、もう一つ、ちょっと、邪道っぽい(※6)のですが、None は、False と しても判定できるので、or 演算子(※7)で、式を評価して、返します。
>>> y=x.get('a') or 'AAA'
>>> print(y)
AAA
>>>
判りやすいのですが、先ほどの3項演算子とは、判定方法が異なるので、注意が必要です。
3項演算子の is None では、 True の場合に初期値を返しますが、長さゼロの文字列は、 is None では、False になります。or 演算子の場合は、初期値ではなくゼロ文字列が返されます。
>>> x['b']=''
>>> z=x.get('b') or 'BBB'
>>> print(z)
BBB
>>>
>>> z='BBB' if( x.get('b') is None ) else x.get('b')
>>> print(z)
>>>
この手の微妙な判定を、言語の特殊な機能に任せるのは、あまりよくないと思います。 コードが多少長くなっても、間違いなく動くプログラムが良いプログラムだと思います。
「今日は、ここまでにしといたろ~」(※8)
======= <<注釈>>=======
※1 「コラム色って、何?」
エラーの実行結果以外で、仮想彼女が話しかけてきた、という仮想です。
※2 「なーんだ、つまんないの」
なぜ、仮想彼女に、つまらない呼ばわりされなければならないのか、疑問です。
※3 「そんなの、判るわけないでしょ」
>>> x['a']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'a'
>>>
※4 try-except文 を使うと、こんな感じになります。
>>> y=None
>>> try:
... y=x['a']
... except:
... y=None
...
>>> print(y)
None
>>>
※5 「あなたより、ましでしょ」
今回は、出番が少ないので、ちょっと、ご機嫌斜めなようです。
※6 邪道っぽい
Pythonっぽいと言い換えた方が良いかも。
※7 or 演算子
通常、論理演算の and や or は、論理値 (True/False) を返しますが、 Pythonの場合、式の評価の結果、その値を返します。
式 x and yは、次と等価です
if not bool(x): # xの論理値がFalseなら
return x # yを見ることなく、しかもFalseではなくxそのものをリターン
else: # xの論理値がTrueなら
return y # bool(y) ではなく、yそのものをリターン
同様に、式x or yは次と等価です if bool(x): # xの論理値がTrueなら return x # yを見ることなく、しかもTrueではなくxそのものをリターン else: # xの論理値がFalseなら return y # bool(y) ではなく、yそのものをリターン
https://qiita.com/keisuke-nakata/items/e0598b2c13807f102469
bool の判定で、0 や None、長さゼロのリストや空の辞書などは、Falseで、 0以外の数字、長さゼロでない文字列など、False以外は、True になります。
※8 「今日は、ここまでにしといたろ~」
今回は、出番が少ないので、最後に一言、言いたかったようです。