今、話題の人工知能(AI)などで人気のPython。初心者に優しいとか言われていますが、全然優しくない! という事を、つらつら、愚痴っていきます

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 「今日は、ここまでにしといたろ~」

 今回は、出番が少ないので、最後に一言、言いたかったようです。

Comment(0)

コメント

コメントを投稿する