Kの備忘録(仮)

Python、VBA、Excelを中心に記事を投稿

Pythonのenumを使って2次元リストを管理する

はじめに

前回はpandasを使って表を加工する方法を書きました。VBAでは表の加工に対して、Enumは有効でしたが、Pythonの場合は表を加工するにはpandasが適していると思うので、今回は2次元リストのデータをPythonenumを使ってを管理してみたいと思います。

今回用意したデータ

青空文庫の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クラスを使う方が便利です。

おわりに

実はPythonenumは整数以外もグルーピングして定義することができます。

日を開けて、enumについてもう少し掘り下げてみたいと思います。