Pythonのenumを使って2次元リストを管理する
はじめに
前回はpandasを使って表を加工する方法を書きました。VBAでは表の加工に対して、Enumは有効でしたが、Pythonの場合は表を加工するにはpandasが適していると思うので、今回は2次元リストのデータをPythonのenumを使ってを管理してみたいと思います。
今回用意したデータ
青空文庫の2022年1月のXHTML版アクセスランキングのデータを使いたいと思います。
今回は、5位までの内容を手打ちした2次元リストを用意しました。
# 青空文庫のランキング内容をリストに格納 books_list = [['〔雨ニモマケズ〕', '宮沢 賢治', 'https://www.aozora.gr.jp/index_pages/person81.html', 28940], ['走れメロス', '太宰 治', 'https://www.aozora.gr.jp/cards/000035/card1567.html', 24778], ['こころ', '夏目 漱石', 'https://www.aozora.gr.jp/cards/000148/card773.html', 22993], ['駈込み訴え', '太宰 治', 'https://www.aozora.gr.jp/cards/000035/card277.html', 21407], ['山月記', '中島 敦', 'https://www.aozora.gr.jp/cards/000119/card624.html', 19608]]
この2次元リストを使って、ランキングした本の詳細を出力するツールをenumのIntEnumクラスを使って作ります。
IntEnumクラスを活用したコード
from enum import auto, IntEnum class Aozorabunko(IntEnum): title = 0 author = auto() url = auto() clicks = auto() input_ranking_number = int(input('表示したいのは何位の本ですか?')) num = input_ranking_number -1 # 青空文庫のランキング内容をリストに格納 books_list = [['〔雨ニモマケズ〕', '宮沢 賢治', 'https://www.aozora.gr.jp/index_pages/person81.html', 28940], ['走れメロス', '太宰 治', 'https://www.aozora.gr.jp/cards/000035/card1567.html', 24778], ['こころ', '夏目 漱石', 'https://www.aozora.gr.jp/cards/000148/card773.html', 22993], ['駈込み訴え', '太宰 治', 'https://www.aozora.gr.jp/cards/000035/card277.html', 21407], ['山月記', '中島 敦', 'https://www.aozora.gr.jp/cards/000119/card624.html', 19608]] title = books_list[num][Aozorabunko.title] author = books_list[num][Aozorabunko.author] url = books_list[num][Aozorabunko.url] clicks = books_list[num][Aozorabunko.clicks] print(f'2022年1月のXHTML版 アクセスランキングは{input_ranking_number}位は{author}の{title}です。クリック数は{clicks}でした!! \n詳細のurlはこちらです→{url}')
これを実行するとこんな感じになります。
たとえば「1」と入力すると・・・
1位の「〔雨ニモマケズ〕」の情報が出力されました!
enumの解説
enumは、列挙型(定数をグルーピングして定義できる型)をサポートしています。enumには4つの列挙型のクラスがあります。
- Enum
- IntEnum
- Flag
- IntFlag
このうちのEnumクラスとIntEnumクラスについて説明します。
Enumクラスはnameとvalueというプロパティを持っています。中身を確認してみましょう。
print(Aozorabunko.clicks.name) # 出力結果:clicks print(Aozorabunko.clicks.value) # 出力結果:3
今回使用したIntEnumクラスは、設定値をint型として取り扱うことができます。EnumクラスとIntEnumクラスを比較すると以下のとおりです。
from enum import Enum, auto, IntEnum class Aozorabunko(Enum): title = 0 author = auto() url = auto() clicks = auto() class IntAozorabunko(IntEnum): title = 0 author = auto() url = auto() clicks = auto() print(Aozorabunko.clicks == 3) # 出力結果:False print(Aozorabunko.clicks.value == 3) # 出力結果:True print(IntAozorabunko.clicks == 3) # 出力結果:True
このように整数を定数としてグルーピングしたいときは、IntEnumクラスを使う方が便利です。
おわりに
実はPythonのenumは整数以外もグルーピングして定義することができます。
日を開けて、enumについてもう少し掘り下げてみたいと思います。