エクセルの表形式のデータをPythonで取り込むには「辞書のリスト(list of dictionaries)」にするのが最もシンプルな方法です。つまり、1行分のデータを辞書にしてリストに格納します。
例えば、以下の学生名簿をPythonのデータに取り込むには、1行分を学籍番号、名前、クラスをキーとする辞書にしてリストに格納します。
学生名簿
学籍番号 | 名前 | クラス |
---|---|---|
020 | 中山勇一 | B |
026 | 石原孝行 | C |
041 | 田中五月 | B |
017 | 大友純二 | A |
034 | 高田紗希 | B |
010 | 重松秀一 | A |
008 | 柳田愛結 | C |
この名簿は以下のdict_list
のような辞書のリストとしてPythonに取り込みます。
>>> dict_list = [
{"学籍番号": "020", "名前": "中山勇一", "クラス": "B"},
{"学籍番号": "026", "名前": "石原孝行", "クラス": "C"},
{"学籍番号": "041", "名前": "田中五月", "クラス": "B"},
{"学籍番号": "017", "名前": "大友純二", "クラス": "A"},
{"学籍番号": "034", "名前": "高田紗希", "クラス": "B"},
{"学籍番号": "010", "名前": "重松秀一", "クラス": "A"},
{"学籍番号": "008", "名前": "柳田愛結", "クラス": "C"}
]
エクセルの表データを行ごとに辞書で読み込む方法(Python+OpenPyXL)
一般にデータを処理するには、並び替え(ソート)の必要が生じることがよくあります。その時に、データが辞書のリストになっていると並び替えしやすくなります。
今回はこの辞書のリストをPythonで並び替える方法を説明します。ポイントは標準モジュールのoperatorにあるitemgetter()関数
をキーの指定に用いるところです。
本記事の目次
並び替えに用いるキーの指定方法
今回のデータは、学籍番号、名前、クラスの3つの項目(キー)があるので、「どの項目の値で並び替えるか」で結果は異なります。つまり、どのキーで並び替えるのかを指定する必要があります。
リストの並び替えには、組み込み関数のsorted()
を用いますが、並び替えに用いるキーは以下のようにかっこ内のkey=
に指定します。
sorted(辞書のリスト, key=itemgetter(並び替えるキー))
ここで、キーを指定する時にはoperatorモジュール のitemgetter()関数
を用います。「学籍番号」をキーにして並び替えるには、以下のようにコーディングします。
>>> from operator import itemgetter
>>> sorted_list = sorted(dict_list, key=itemgetter("学籍番号"))
>>> from pprint import pprint
>>> pprint(sorted_list)
[{'クラス': 'C', '名前': '柳田愛結', '学籍番号': '008'},
{'クラス': 'A', '名前': '重松秀一', '学籍番号': '010'},
{'クラス': 'A', '名前': '大友純二', '学籍番号': '017'},
{'クラス': 'B', '名前': '中山勇一', '学籍番号': '020'},
{'クラス': 'C', '名前': '石原孝行', '学籍番号': '026'},
{'クラス': 'B', '名前': '高田紗希', '学籍番号': '034'},
{'クラス': 'B', '名前': '田中五月', '学籍番号': '041'}]
operatorは標準モジュールなので、インポートすれば使えます。また、見やすく表示するために、print()
の代わりに標準モジュールにあるpprint.pprint() で出力しています。
リストのsort()メソッドでも同様です
データ自体をソートしたい場合は、リストのsort()メソッド
を用いますが、並び替えるキーは以下のように同様に指定します。
>>> dict_list.sort(key=itemgetter("学籍番号"))
同じ値を持つ要素が複数ある場合
「学籍番号」のように値が一意ではなく、同じ値の要素が複数ある「クラス」にも使用できます。並び替えるキーに「クラス」を指定すると、以下のようにクラス順に並び替えできます。
>>> sorted_list = sorted(dict_list, key=itemgetter("クラス"))
>>> pprint(sorted_list)
[{'クラス': 'A', '名前': '大友純二', '学籍番号': '017'},
{'クラス': 'A', '名前': '重松秀一', '学籍番号': '010'},
{'クラス': 'B', '名前': '中山勇一', '学籍番号': '020'},
{'クラス': 'B', '名前': '田中五月', '学籍番号': '041'},
{'クラス': 'B', '名前': '高田紗希', '学籍番号': '034'},
{'クラス': 'C', '名前': '石原孝行', '学籍番号': '026'},
{'クラス': 'C', '名前': '柳田愛結', '学籍番号': '008'}]
並び替えた中をさらに並び替える方法
上の操作では、同じクラスの学生が学籍番号順になっていません。itemgetter()関数
を使えば、あるキーで並び替えた後に、さらに他のキーで並び替えることができます。それには、以下のようにカンマ区切りで「学籍番号」を2つ目のキーに指定します。
>>> sorted_list = sorted(dict_list, key=itemgetter("クラス", "学籍番号"))
>>> pprint(sorted_list)
[{'クラス': 'A', '名前': '重松秀一', '学籍番号': '010'},
{'クラス': 'A', '名前': '大友純二', '学籍番号': '017'},
{'クラス': 'B', '名前': '中山勇一', '学籍番号': '020'},
{'クラス': 'B', '名前': '高田紗希', '学籍番号': '034'},
{'クラス': 'B', '名前': '田中五月', '学籍番号': '041'},
{'クラス': 'C', '名前': '柳田愛結', '学籍番号': '008'},
{'クラス': 'C', '名前': '石原孝行', '学籍番号': '026'}]
タプルのリストを並び替える方法
今回のデータがタプルのリストで収納された場合でも、同様にitemgetter()関数
を利用できます。その場合は、キーではなくインデックス番号で指定します。
つまり、以下のようなタプルのリストがあるとします。
>>> tuple_list = [
("020", "中山勇一", "B"),
("026", "石原孝行", "C"),
("041", "田中五月", "B"),
("017", "大友純二", "A"),
("034", "高田紗希", "B"),
("010", "重松秀一", "A"),
("008", "柳田愛結", "C")
]
このデータを学籍番号、つまりタプルの1つ目の要素で並び替えるには以下のitemgetter(0)
ように、インデックス番号で指定します。
>>> sorted_list = sorted(tuple_list, key=itemgetter(0))
>>> pprint(sorted_list)
[('008', '柳田愛結', 'C'),
('010', '重松秀一', 'A'),
('017', '大友純二', 'A'),
('020', '中山勇一', 'B'),
('026', '石原孝行', 'C'),
('034', '高田紗希', 'B'),
('041', '田中五月', 'B')]
さらに、クラス、つまりタプルの3つ目の要素で並び替えた上に、その中のを学籍番号順にするには、itemgetter(2, 0)
のようにカンマ区切りで2つ指定します。
>>> sorted_list = sorted(tuple_list, key=itemgetter(2, 0))
>>> pprint(sorted_list)
[('010', '重松秀一', 'A'),
('017', '大友純二', 'A'),
('020', '中山勇一', 'B'),
('034', '高田紗希', 'B'),
('041', '田中五月', 'B'),
('008', '柳田愛結', 'C'),
('026', '石原孝行', 'C')]
昇順と降順
デフォルトは昇順ですが、降順で並び替えるには以下のようにreverse=True
を指定します。
>>> sorted_list = sorted(dict_list, key=itemgetter("学籍番号"), reverse=True)
>>> pprint(sorted_list)
[{'クラス': 'B', '名前': '田中五月', '学籍番号': '041'},
{'クラス': 'B', '名前': '高田紗希', '学籍番号': '034'},
{'クラス': 'C', '名前': '石原孝行', '学籍番号': '026'},
{'クラス': 'B', '名前': '中山勇一', '学籍番号': '020'},
{'クラス': 'A', '名前': '大友純二', '学籍番号': '017'},
{'クラス': 'A', '名前': '重松秀一', '学籍番号': '010'},
{'クラス': 'C', '名前': '柳田愛結', '学籍番号': '008'}]
最後に
プログラミングにおいて「ソート」は非常に重要なアルゴリズムです。様々な利用目的に応じて臨機にソートできるようになることはとても大事です。Pythonにおけるソートについては以下の公式ドキュメントが参考になりますので、一度眼を通しておくことをオススメします。