リファクタリングをPythonで実践!基本手法とコード例・注意点まで
1.Pythonとは?
Python(「パイソン」と読みます)はプログラミング言語の一種です。簡潔な記述で高度な処理を実装でき、多量のデータの扱いに秀でていることから、AI開発、データベースを使用したWeb開発、統計処理、数学的な研究などに用いられています。
Pythonの人気が高まってきたのはここ数年です。初めはAI開発に適した言語と言うことで注目されました。この記事で紹介する「辞書」というデータ型も、多量のデータを効率よく処理するために導入されたデータ型です。
簡潔な記述であることから、プログラミング初心者が最初に学習するプログラミング言語としても注目されています。大学やプログラミングスクールなどでPythonが教えられています。e-ラーニングの教材も多数出ています。
2.Pythonの「辞書」とは?
「辞書」とは、簡単に言うと、データのまとまりで、要素(まとまりのなかの一つひとつのデータのことです)に文字列のラベルを付けてアクセスできるようにするものです。ラベルのことを「キー」と言います。これに対して、「リスト」と「タプル」というものもあります。
「リスト」や「タプル」は要素にアクセスするとき、キーではなく、インデックス(何番目の要素か)でアクセスします。また「リスト」は要素の値を変えられますが、「タプル」は要素の値を変えられない、という違いがあります。「辞書」も要素の値を変えることができます。
3.Pythonの辞書の基本的な使い方
Pythonでの辞書の基本的な使い方について解説します。ぜひ覚えてください。
①辞書(ディクショナリ)の作成とアクセス
辞書は次のように「{}」と「:」「,」を使って作成します。
price_dict = {'冷凍パスタ':198, 'コッペパン':78, '野菜ジュース':68}
この場合、price_dictは商品の価格を示しています。「冷凍パスタ」「コッペパン」「野菜ジューズ」がキーです。アクセスするときは
print(price_dict['冷凍パスタ'])
print(price_dict['コッペパン'])
のようにキーを指定してアクセスします。
このコードを実行すると、以下の出力結果が得られます。
198
78
作成するときは「{}」を使いますが、アクセスするときは「リスト」や「タプル」と同じく「[]」を使うということに注意してください。
辞書の要素は、同じデータ型でなくても構いません。
price_dict = {'冷凍パスタ':198, 'コッペパン':78, '野菜ジュース':68, 'マンゴー':'取り扱いなし'}
でも構いません。
print(price_dict['マンゴー'])
このコードを実行すると、以下の出力結果が得られます。
取り扱いなし
②辞書の要素の追加と変更
辞書の要素の追加と変更は、全く同じ方法で行います。
price_dict = {'冷凍パスタ':198, 'コッペパン':78, '野菜ジュース':68}
price_dict['コッペパン'] = 108
このように、キーを指定して新しい値を代入するだけです。辞書内に存在していないキーの場合は新たな要素が追加されます。
price_dict = {'冷凍パスタ':198, 'コッペパン':78, '野菜ジュース':68}
price_dict['豚バラ肉'] = 258
print(price_dict)
出力:
{'冷凍パスタ':198,'コッペパン':78,'野菜ジュース':68,'豚バラ肉';258}
補足ですが、辞書では要素の現れる順番は保証されていません。このコードをあなたの環境で実行したら、要素が表示される順番が変わるかもしれません。辞書とはそういうものです。バグではないので安心してください。
③辞書内の要素の検索方法
辞書の検索と言っても
- キーの検索
- 値の検索
- キーと値のペアの検索
と3種類あります。それぞれ解説します。
キーの検索は
in
を書くだけです。
price_dict = {'冷凍パスタ':198, 'コッペパン':78, '野菜ジュース':68}
if '冷凍パスタ' in price_dict:
print('冷凍パスタがありました')
出力:
冷凍パスタがありました
これだと少し分かりにくいので、keys()をわざと書く場合もあります。keys()を書くとキーの検索になります。
price_dict = {'冷凍パスタ':198, 'コッペパン':78, '野菜ジュース':68}
if '冷凍パスタ' in price_dict.keys():
print('冷凍パスタがありました')
ないことを確認したい場合、
not in
を使います。
price_dict = {'冷凍パスタ':198, 'コッペパン':78, '野菜ジュース':68}
if 'マンゴー' not in price_dict.keys():
print('マンゴーがありません')
値の検索は、values()を使います。
price_dict = {'冷凍パスタ':198, 'コッペパン':78, '野菜ジュース':68}
if 198 in price_dict.values():
print('198円の商品がありました')
出力:
198円の商品がありました
この場合もnot inも使えます。キーと値のペアの検索の書き方は少し面倒です。items()を使います。
price_dict = {'冷凍パスタ':198, 'コッペパン':78, '野菜ジュース':68}
if ('冷凍パスタ', 198) in price_dict.items():
print('198円の冷凍パスタがありました')
出力:
198円の冷凍パスタがありました
左辺に「()」を書き、「,」も書かなければならないので注意してください。この場合もnot inも使えます。
4.Pythonの辞書の応用的な使い方
Pythonの辞書の応用的な使い方について解説します。うまくやり方を覚えておけば、プログラムを効率的に書けます。
①辞書とfor文
辞書にfor文でアクセスするのは、辞書型を使う際一番使用する方法です。実は、for文では先述の検索で出てきたkeys()、values()、items()を使います。キーでループを回すときはkeys()を使います。
price_dict = {'冷凍パスタ':198, 'コッペパン':78, '野菜ジュース':68}
for k in price_dict.keys():
print(str(k) + ',' + str(price_dict[k]))
出力:
冷凍パスタ,198
コッペパン,78
野菜ジュース,68
対して、値でループを回すときはvalues()を使います。
price_dict = {'冷凍パスタ':198, 'コッペパン':78, '野菜ジュース':68}
sum = 0
for v in price_dict.values():
sum += int(v)
print(sum)
出力:
344
上記のサンプルコードではprice_dictの全ての商品の価格の合計を求めています。items()はキーと値のペアを順番に取り出します。
price_dict = {'冷凍パスタ':198, 'コッペパン':78, '野菜ジュース':68}
for k,v in price_dict.items():
print(str(k) + ',' + str(v))
出力:
冷凍パスタ,198
コッペパン,78
野菜ジュース,68
②辞書のなかに辞書、リスト、タプルを入れる
辞書の要素のデータ型は何であっても構わないことから、値として辞書やリストやタプルを持っても全く構いません。というか、実際にはこの構造をしたデータをよく扱います。
price_dict = {'冷凍パスタ':198, 'コッペパン':78, '野菜ジュース':68}
price_dict['豚バラ肉'] = {'通常':258, 'セール':228}
print(price_dict)
print(price_dict['豚バラ肉'])
print(price_dict['豚バラ肉']['セール'])
出力:
{'冷凍パスタ':198,'コッペパン':78,'野菜ジュース':68,'豚バラ肉':{'通常':258,'セール':228}}
{'通常':258,'セール':228}
228
最後の行の書き方に注目してください。このように、多段階に渡って一気にアクセスすることもできます。
③辞書を逆引きする方法
逆引きというのは値からキーを探ることです。逆引きは地道に値を一つずつ調べるしかありません。
price_dict = {'冷凍パスタ':198, 'コッペパン':78, '野菜ジュース':68}
for k,v in price_dict.items():
if v == 78:
print('78円の商品は' + str(k) + 'です')
出力:
78円の商品はコッペパンです
これだと値が「ない」場合の書き方がよく分からなくなりますので、以下のような関数を使う手段が良く用いられます。
def lookup(dict, x):
for k,v in dict.items():
if x == v:
return k
price_dict = {'冷凍パスタ':198, 'コッペパン':78, '野菜ジュース':68}
print(lookup(price_dict, 78))
print(lookup(price_dict, 100))
出力:
コッペパン
None
これは関数が値を返さないとき、Noneを返したことになるというPythonの性質を利用しています。やや高度な書き方ですが、覚えておきましょう。
5.Pythonで辞書を扱う際の注意点やコツ
辞書は要素として更に辞書などを入れることができ、データの処理に便利なデータ型ですが、あまりに構造を複雑にしすぎると自分でコーディングしていてどういう構造になっているのか分からなくなり、扱いに窮します。内部構造はなるべくシンプルにして、複雑になりそうなときは別な辞書型の変数にした方がいいでしょう。