エクセルの表形式のデータを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におけるソートについては以下の公式ドキュメントが参考になりますので、一度眼を通しておくことをオススメします。

ソート HOW TO(Python公式ドキュメント)