Python学習【365日チャレンジ!】274日目のマスターU(@Udemy11)です。
今日はポッキーの日ですね。
江崎グリコ株式会社が11月11日をポッキー&プリッツの日と定めて、日本記念日協会から認定され、平成11年11月11日にポッキー&プリッツの日がスタートしたそうです。
毎年ポッキーの日だよな〜と思いつつ、ポッキーを食べそこねているので、今年はきっちりポッキーとプリッツを食べておきました。
それでは今日も、Python学習を始めましょう。
昨日の復習
昨日は、辞書型データをリストに入れて便利に扱えるChainMap
を学習しました。
update
メソッドのように、複数の辞書型データを一つにまとめるのではなく、複数の辞書型データを個別に保有して、順番を入れ替えたり、値を更新したり、新たな辞書型データを追加したりすることができました。
詳しくは昨日の記事をごらんください。
今日は、ChainMap
を継承して条件を付与して値を更新する方法を学習します。
継承クラス
条件をつけて値を更新するには、ChainMap
クラスを継承したクラスを定義して条件を付与します。
import collections
a = {'a': 'a', 'num': 10}
b = {'b': 'b', 'c': 'cc'}
c = {'b': 'bbb', 'e': 'e'}
class DeepChainMap(collections.ChainMap):
def __setitem__(self, key, value):
for mapping in self.maps:
if type(mapping[key]) is int and mapping[key] < value:
mapping[key] = value
return
m = DeepChainMap(a, b, c)
print(m['num'])
m['num'] = 12
print(m['num'])
print(m.maps)
3行目から5行目で辞書型データを定義しています。
7行目でChainMap
を継承したDeepChainMap
クラスを作成し、8行目の__setitem__
で条件を定義します。
for
ループでself.maps
を回して、10行目から12行目で、タイプがint
で、DeepChainMap
に入れたkey
のvalue
よりも入力されたkey
のvalue
のほうが大きい場合は、DeepChainMap
に入っているkey
のvalue
を上書きして、条件に合わなければ何もしないというクラスを作成しています。
14行目でDeepChainMap
のオブジェクトm
を作成して、15行目でDeepChainMap
に入っているnum
のvalue
を出力しています。
次に16行目でm
のnum
に、12
を代入していますが、このとき、最初に代入されている10
より大きいので、値が上書きされます。
17行目で再びnum
のvalue
を出力すると、上書きされた12
が出力されます。
最後の行でm.maps
を出力しています。
出力結果
10
12
[{'a': 'a', 'num': 12}, {'b': 'b', 'c': 'cc'}, {'b': 'bbb', 'e': 'e'}]
ちなみに、16行目をm['num'] = 5
に変更すると、10
以下になるため、値は更新されずに10
のままになります。
条件を追加
次に、16行目で指定するkey
が、DeepChainMap
に入れた辞書型データのkey
が存在する場合は、value
の値をチェックして値を更新するかそのままにするか判断して、存在しない場合は、辞書型データにkey-value
を追加するコードに変更してみます。
import collections
a = {'a': 'a', 'num': 10}
b = {'b': 'b', 'c': 'cc'}
c = {'b': 'bbb', 'e': 'e'}
class DeepChainMap(collections.ChainMap):
def __setitem__(self, key, value):
for mapping in self.maps:
if key in mapping:
if type(mapping[key]) is int and mapping[key] < value:
mapping[key] = value
return
self.maps[0][key] = value
m = DeepChainMap(a, b, c)
m['add_num'] = 8
print(m.maps)
出力結果
[{'a': 'a', 'num': 10, 'add_num': 8}, {'b': 'b', 'c': 'cc'}, {'b': 'bbb', 'e': 'e'}]
10行目と14行目を追加して、出力は18行目のm.maps
だけにしています。
17行目でkeyがadd_num
にvalueを8
にしていますが、add_num
がリストに存在しないので、出力結果を見るとmaps
の最初の辞書型データにkey-value
の値が追加されているのがわかります。
17行目をm['num'] = 8
にすると、値は追加されませんが、m['num'] = 12
にすると、最初に入っていたnum
が12
に更新されて出力されます。
まとめ
紹介したコードでいろいろと値を変えてみたり、追加する辞書型データの順番を変えてみたりすると、どのような処理がされているのかつかめてくるので、ぜひいろいろと試してみてください。
これまでも口を酸っぱくして言っていますが(正確には喋っているわけではないので、何度も書いているが正しい?)、いろいろと自分で試すことが大切です。
私も酒井さんの講座を学習しながら、いろいろと普通の人はやらないことをやってエラーが起こったりしてしまいますが、エラーが起こってみないと理解を深めることはできません。
コードを書いて、問題なく動いてしまうと、コードを見直すことはしませんが、エラーが起こると、どこが間違っているのかしっかりと確認したり、別のやり方を試したりするので、エラーは起こったほうが学習効果が上がるんじゃないかと感じています。
ぜひ、トライアンドエラーを繰り返して、スキルアップを目指してください。
それでは、明日もGood Python!