Pythonのリスト(list
)をソートする方法(sort
メソッド、sorted
関数)の基本について解説します。また、key引数でキーを指定してソートする方法についても説明します。
Pythonのリスト(list)をソートする
Pythonでは、リストをソートするためにsort
メソッドとsorted
関数が用意されており、簡単に並べ替えを行うことができます。
名称が非常に似たものですが、以下のような違いがあります。「リストそのものをソートする」か「ソートしたリストを返却するか」といった違いがあります。
関数/メソッド名 | 内容 |
---|
sort メソッド | list クラスのメソッドとして実装されているもので、リスト自体をソートする。 |
sorted 関数 | Pythonの組み込み関数で、ソートしたリストを返却する。 |
この記事では、基本的なsort
メソッドやsorted
関数を使ったリストのソート方法を紹介します。
また、ソートでよく実施するkey
引数にソート条件を指定する応用例を紹介します。具体的には、lambda
関数を使用した方法とoperator
モジュールのitemgetter
、attrgetter
を使用した方法を説明します。
sortメソッド、sorted関数の基本的な使い方
リスト(list)を昇順に並べ替える方法
sortメソッドを使用する場合
sort
メソッドを使用する場合は、以下の例のように使用します。
# リストのデータそのものをソートする。(sortメソッド)
data = [15, 5, 20, 1, 10, 25]
# リストのデータそのものをソートする。(sortメソッド)
data = [15, 5, 20, 1, 10, 25]
data.sort()
print(f"data: {data}")
# リストのデータそのものをソートする。(sortメソッド)
data = [15, 5, 20, 1, 10, 25]
data.sort()
print(f"data: {data}")
data: [1, 5, 10, 15, 20, 25]
【実行結果】
data: [1, 5, 10, 15, 20, 25]
【実行結果】
data: [1, 5, 10, 15, 20, 25]
上記例を見ると、元のリスト自体が並べ替えられていることが分かります。並べ替え対象のデータを直接並べ替えたいときにはsortメソッドを使いましょう。
sorted関数を使用する場合
sorted
関数を使用する場合は、以下のようにsorted
関数に対象のリストを渡して使用します。
# リストを昇順に並べ替えたリストを返却する。(sorted関数)
data = [15, 5, 20, 1, 10, 25]
sorted_data = sorted(data)
print(f"sorted_data: {sorted_data}")
# リストを昇順に並べ替えたリストを返却する。(sorted関数)
data = [15, 5, 20, 1, 10, 25]
sorted_data = sorted(data)
print(f"data: {data}")
print(f"sorted_data: {sorted_data}")
# リストを昇順に並べ替えたリストを返却する。(sorted関数)
data = [15, 5, 20, 1, 10, 25]
sorted_data = sorted(data)
print(f"data: {data}")
print(f"sorted_data: {sorted_data}")
data: [15, 5, 20, 1, 10, 25]
sorted_data: [1, 5, 10, 15, 20, 25]
【実行結果】
data: [15, 5, 20, 1, 10, 25]
sorted_data: [1, 5, 10, 15, 20, 25]
【実行結果】
data: [15, 5, 20, 1, 10, 25]
sorted_data: [1, 5, 10, 15, 20, 25]
上記例を見ると、元のリストは変更されていません。もともとのデータは残したまま、並べ替えたデータを用意したいときにはsorted関数を使いましょう。
リスト(list)を降順に並べ替える方法
sortメソッドを使用する場合
リストを降順に並べ替える際には、以下のようにsort
メソッドのreverse
オプションにTrue
を設定します。
# リストのデータそのものを降順でソートする。(sortメソッド、reverse)
data = [15, 5, 20, 1, 10, 25]
# リストのデータそのものを降順でソートする。(sortメソッド、reverse)
data = [15, 5, 20, 1, 10, 25]
data.sort(reverse=True)
print(f"data: {data}")
# リストのデータそのものを降順でソートする。(sortメソッド、reverse)
data = [15, 5, 20, 1, 10, 25]
data.sort(reverse=True)
print(f"data: {data}")
data: [25, 20, 15, 10, 5, 1]
【実行結果】
data: [25, 20, 15, 10, 5, 1]
【実行結果】
data: [25, 20, 15, 10, 5, 1]
結果を見ると降順でソートができていることが分かるかと思います。
sorted関数を使用する場合
sorted
関数もsort
メソッド同様で、以下のようにreverse
オプションにTrueを設定することで、降順での並べ替えることができます。
# リストを降順に並べ替えたリストを返却する。(sorted、reverse)
data = [15, 5, 20, 1, 10, 25]
sorted_data = sorted(data, reverse=True)
print(f"sorted_data: {sorted_data}")
# リストを降順に並べ替えたリストを返却する。(sorted、reverse)
data = [15, 5, 20, 1, 10, 25]
sorted_data = sorted(data, reverse=True)
print(f"data: {data}")
print(f"sorted_data: {sorted_data}")
# リストを降順に並べ替えたリストを返却する。(sorted、reverse)
data = [15, 5, 20, 1, 10, 25]
sorted_data = sorted(data, reverse=True)
print(f"data: {data}")
print(f"sorted_data: {sorted_data}")
data: [15, 5, 20, 1, 10, 25]
sorted_data: [25, 20, 15, 10, 5, 1]
【実行結果】
data: [15, 5, 20, 1, 10, 25]
sorted_data: [25, 20, 15, 10, 5, 1]
【実行結果】
data: [15, 5, 20, 1, 10, 25]
sorted_data: [25, 20, 15, 10, 5, 1]
結果を見ると降順でソートができていることが分かるかと思います。
keyを指定してリストをソートする
上記では非常にシンプルなソート例を見てきました。Pythonのリストでは、リストのリストや辞書のリスト、クラスオブジェクトのリスト等も作れます。このような場合には、特定キーを指定してソートが必要になるケースが多いです。
sort
メソッドやsorted
メソッドにはkey
引数があり、この引数を指定することで特定キーとして指定した値を基準にデータをソートすることができます。以降では、よく使用されるlambda
関数を使った指定方法とoperator
モジュールの関数であるitemgetter
やattrgetter
を使用した方法を解説していきます。
lambda関数を用いたkeyの指定方法
sort
メソッドやsort
関数でkey
引数を指定する場合には、lambda
関数でキーの情報を指定する方法が一般的に利用されます。ここでは、sort
メソッド、sort
関数それぞれで簡単な例を使って紹介していきます。
なお、lambda関数については「ラムダ(lambda)関数:無名関数の使い方」でまとめていますので参考にしてください。
sortメソッドを使用する場合
リストのリスト
sort
メソッドのkey
引数指定方法をリストのリストデータを対象に使用例をみてみましょう。以下の例は、ID、名前、値を持っているリストを複数持っているようなリストです。このデータを各列(属性)の値を基準にソートしてみましょう。
# ===== keyを指定してソートする (sortメソッド)
data.sort(key=lambda d: d[0])
data.sort(key=lambda d: d[1])
data.sort(key=lambda d: d[2])
data = [
["ID002", "john", 70],
["ID001", "mike", 20],
["ID005", "jane", 1],
["ID004", "aiko", 50],
["ID003", "taro", 5],
]
# ===== keyを指定してソートする (sortメソッド)
# 0列目でソートする場合
data.sort(key=lambda d: d[0])
print(f"data: {data}")
# 1列目でソートする場合
data.sort(key=lambda d: d[1])
print(f"data: {data}")
# 2列目でソートする場合
data.sort(key=lambda d: d[2])
print(f"data: {data}")
data = [
["ID002", "john", 70],
["ID001", "mike", 20],
["ID005", "jane", 1],
["ID004", "aiko", 50],
["ID003", "taro", 5],
]
# ===== keyを指定してソートする (sortメソッド)
# 0列目でソートする場合
data.sort(key=lambda d: d[0])
print(f"data: {data}")
# 1列目でソートする場合
data.sort(key=lambda d: d[1])
print(f"data: {data}")
# 2列目でソートする場合
data.sort(key=lambda d: d[2])
print(f"data: {data}")
data: [['ID001', 'mike', 20], ['ID002', 'john', 70], ['ID003', 'taro', 5], ['ID004', 'aiko', 50], ['ID005', 'jane', 1]]
data: [['ID004', 'aiko', 50], ['ID005', 'jane', 1], ['ID002', 'john', 70], ['ID001', 'mike', 20], ['ID003', 'taro', 5]]
data: [['ID005', 'jane', 1], ['ID003', 'taro', 5], ['ID001', 'mike', 20], ['ID004', 'aiko', 50], ['ID002', 'john', 70]]
【実行結果】
data: [['ID001', 'mike', 20], ['ID002', 'john', 70], ['ID003', 'taro', 5], ['ID004', 'aiko', 50], ['ID005', 'jane', 1]]
data: [['ID004', 'aiko', 50], ['ID005', 'jane', 1], ['ID002', 'john', 70], ['ID001', 'mike', 20], ['ID003', 'taro', 5]]
data: [['ID005', 'jane', 1], ['ID003', 'taro', 5], ['ID001', 'mike', 20], ['ID004', 'aiko', 50], ['ID002', 'john', 70]]
【実行結果】
data: [['ID001', 'mike', 20], ['ID002', 'john', 70], ['ID003', 'taro', 5], ['ID004', 'aiko', 50], ['ID005', 'jane', 1]]
data: [['ID004', 'aiko', 50], ['ID005', 'jane', 1], ['ID002', 'john', 70], ['ID001', 'mike', 20], ['ID003', 'taro', 5]]
data: [['ID005', 'jane', 1], ['ID003', 'taro', 5], ['ID001', 'mike', 20], ['ID004', 'aiko', 50], ['ID002', 'john', 70]]
リストに含まれる各リストのどの列をキーにするかはlambda
関数で指定します。
例えば、「lambda d: d[0]
」という関数は、引数d
を受け取ってd
の0
番目を返却する関数です。この処理をするlambda
関数をkey
引数に渡してあげることで、sort
メソッド内部では対象データリストをlambda
関数を通した返却値をもとにソートをします。
実行結果を見ると指定した列番号の値でリストがソートされていることが分かるかと思います。
辞書のリストデータ
辞書のリストでも考え方は同じです。以下の例で見てみましょう。
{"id": "ID002", "name": "john", "value": 70},
{"id": "ID001", "name": "mike", "value": 20},
{"id": "ID005", "name": "jane", "value": 1},
{"id": "ID004", "name": "aiko", "value": 50},
{"id": "ID003", "name": "taro", "value": 5},
# ===== keyを指定してソートする (sortメソッド)
data.sort(key=lambda d: d["id"])
data.sort(key=lambda d: d["name"])
data.sort(key=lambda d: d["value"])
data = [
{"id": "ID002", "name": "john", "value": 70},
{"id": "ID001", "name": "mike", "value": 20},
{"id": "ID005", "name": "jane", "value": 1},
{"id": "ID004", "name": "aiko", "value": 50},
{"id": "ID003", "name": "taro", "value": 5},
]
# ===== keyを指定してソートする (sortメソッド)
# idでソートする場合
data.sort(key=lambda d: d["id"])
print(f"data: {data}")
# nameでソートする場合
data.sort(key=lambda d: d["name"])
print(f"data: {data}")
# valueでソートする場合
data.sort(key=lambda d: d["value"])
print(f"data: {data}")
data = [
{"id": "ID002", "name": "john", "value": 70},
{"id": "ID001", "name": "mike", "value": 20},
{"id": "ID005", "name": "jane", "value": 1},
{"id": "ID004", "name": "aiko", "value": 50},
{"id": "ID003", "name": "taro", "value": 5},
]
# ===== keyを指定してソートする (sortメソッド)
# idでソートする場合
data.sort(key=lambda d: d["id"])
print(f"data: {data}")
# nameでソートする場合
data.sort(key=lambda d: d["name"])
print(f"data: {data}")
# valueでソートする場合
data.sort(key=lambda d: d["value"])
print(f"data: {data}")
data: [{'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}]
data: [{'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID003', 'name': 'taro', 'value': 5}]
data: [{'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID003', 'name':
'taro', 'value': 5}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID002', 'name': 'john', 'value': 70}]
【実行結果】
data: [{'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}]
data: [{'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID003', 'name': 'taro', 'value': 5}]
data: [{'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID003', 'name':
'taro', 'value': 5}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID002', 'name': 'john', 'value': 70}]
【実行結果】
data: [{'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}]
data: [{'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID003', 'name': 'taro', 'value': 5}]
data: [{'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID003', 'name':
'taro', 'value': 5}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID002', 'name': 'john', 'value': 70}]
辞書のリスト場合は「lambda d: d["id"]
」のように辞書のキーに対応する値を返すようなlambda
関数を指定します。
クラスオブジェクトのリストデータ
クラスのオブジェクトのリストデータの場合には、オブジェクトの属性を使ってソートすることが可能です。以下の例で見てみましょう。
def __init__(self, id, name, value) -> None:
def __repr__(self) -> str:
return repr((self.id, self.name, self.value))
Sample("ID002", "john", 70),
Sample("ID001", "mike", 20),
Sample("ID005", "jane", 1),
Sample("ID004", "aiko", 50),
Sample("ID003", "taro", 5),
# ===== keyを指定してソートする (sortメソッド)
data.sort(key=lambda d: d.id)
data.sort(key=lambda d: d.name)
data.sort(key=lambda d: d.value)
class Sample:
"""サンプルクラス"""
def __init__(self, id, name, value) -> None:
self.id = id
self.name = name
self.value = value
def __repr__(self) -> str:
return repr((self.id, self.name, self.value))
data = [
Sample("ID002", "john", 70),
Sample("ID001", "mike", 20),
Sample("ID005", "jane", 1),
Sample("ID004", "aiko", 50),
Sample("ID003", "taro", 5),
]
# ===== keyを指定してソートする (sortメソッド)
# id属性でソートする場合
data.sort(key=lambda d: d.id)
print(f"data: {data}")
# name属性でソートする場合
data.sort(key=lambda d: d.name)
print(f"data: {data}")
# value属性でソートする場合
data.sort(key=lambda d: d.value)
print(f"data: {data}")
class Sample:
"""サンプルクラス"""
def __init__(self, id, name, value) -> None:
self.id = id
self.name = name
self.value = value
def __repr__(self) -> str:
return repr((self.id, self.name, self.value))
data = [
Sample("ID002", "john", 70),
Sample("ID001", "mike", 20),
Sample("ID005", "jane", 1),
Sample("ID004", "aiko", 50),
Sample("ID003", "taro", 5),
]
# ===== keyを指定してソートする (sortメソッド)
# id属性でソートする場合
data.sort(key=lambda d: d.id)
print(f"data: {data}")
# name属性でソートする場合
data.sort(key=lambda d: d.name)
print(f"data: {data}")
# value属性でソートする場合
data.sort(key=lambda d: d.value)
print(f"data: {data}")
data: [('ID001', 'mike', 20), ('ID002', 'john', 70), ('ID003', 'taro', 5), ('ID004', 'aiko', 50), ('ID005', 'jane', 1)]
data: [('ID004', 'aiko', 50), ('ID005', 'jane', 1), ('ID002', 'john', 70), ('ID001', 'mike', 20), ('ID003', 'taro', 5)]
data: [('ID005', 'jane', 1), ('ID003', 'taro', 5), ('ID001', 'mike', 20), ('ID004', 'aiko', 50), ('ID002', 'john', 70)]
【実行結果】
data: [('ID001', 'mike', 20), ('ID002', 'john', 70), ('ID003', 'taro', 5), ('ID004', 'aiko', 50), ('ID005', 'jane', 1)]
data: [('ID004', 'aiko', 50), ('ID005', 'jane', 1), ('ID002', 'john', 70), ('ID001', 'mike', 20), ('ID003', 'taro', 5)]
data: [('ID005', 'jane', 1), ('ID003', 'taro', 5), ('ID001', 'mike', 20), ('ID004', 'aiko', 50), ('ID002', 'john', 70)]
【実行結果】
data: [('ID001', 'mike', 20), ('ID002', 'john', 70), ('ID003', 'taro', 5), ('ID004', 'aiko', 50), ('ID005', 'jane', 1)]
data: [('ID004', 'aiko', 50), ('ID005', 'jane', 1), ('ID002', 'john', 70), ('ID001', 'mike', 20), ('ID003', 'taro', 5)]
data: [('ID005', 'jane', 1), ('ID003', 'taro', 5), ('ID001', 'mike', 20), ('ID004', 'aiko', 50), ('ID002', 'john', 70)]
クラスオブジェクトのリスト場合は「lambda d: d.id
」のようにすることで、クラスオブジェクトの属性値を取得するようなlambda
関数を指定します。
複数キーで優先順位をつけてソートする場合
上記の例では、一つのキーでソートする例を見てきました。複数キーで優先順位をつけてソートする場合には以下の例のように指定することができます。
# ===== 複数keyを指定してソートする (sortメソッド)
data.sort(key=lambda d: (d[0], d[1]))
data = [
[3, 20, "b"],
[1, 20, "b"],
[2, 10, "a"],
[1, 10, "a"],
[2, 20, "b"],
[3, 10, "a"],
[1, 30, "c"],
[3, 30, "c"],
[2, 30, "c"],
]
# ===== 複数keyを指定してソートする (sortメソッド)
data.sort(key=lambda d: (d[0], d[1]))
print(f"data: {data}")
data = [
[3, 20, "b"],
[1, 20, "b"],
[2, 10, "a"],
[1, 10, "a"],
[2, 20, "b"],
[3, 10, "a"],
[1, 30, "c"],
[3, 30, "c"],
[2, 30, "c"],
]
# ===== 複数keyを指定してソートする (sortメソッド)
data.sort(key=lambda d: (d[0], d[1]))
print(f"data: {data}")
data: [[1, 10, 'a'], [1, 20, 'b'], [1, 30, 'c'], [2, 10, 'a'], [2, 20, 'b'], [2, 30, 'c'], [3, 10, 'a'], [3, 20, 'b'], [3, 30, 'c']]
【実行結果】
data: [[1, 10, 'a'], [1, 20, 'b'], [1, 30, 'c'], [2, 10, 'a'], [2, 20, 'b'], [2, 30, 'c'], [3, 10, 'a'], [3, 20, 'b'], [3, 30, 'c']]
【実行結果】
data: [[1, 10, 'a'], [1, 20, 'b'], [1, 30, 'c'], [2, 10, 'a'], [2, 20, 'b'], [2, 30, 'c'], [3, 10, 'a'], [3, 20, 'b'], [3, 30, 'c']]
この例では、第1優先で0
列目、第2優先で1
列目の値を参考にソートしています。優先順位順にデータを持つtuple
を返すようにlambda
関数を指定します。
sorted関数を使用する場合
sorted
関数についても、key
引数に指定するという点においてsort
メソッドと同じです。sort
メソッドで紹介した例のsorted
関数版にしたソースと結果を紹介します。
リストのリストデータ
# ===== keyを指定してソートする (sorted関数)
sorted_data = sorted(data, key=lambda d: d[0])
print(f"sorted_data: {sorted_data}")
sorted_data = sorted(data, key=lambda d: d[1])
print(f"sorted_data: {sorted_data}")
sorted_data = sorted(data, key=lambda d: d[2])
print(f"sorted_data: {sorted_data}")
data = [
["ID002", "john", 70],
["ID001", "mike", 20],
["ID005", "jane", 1],
["ID004", "aiko", 50],
["ID003", "taro", 5],
]
# ===== keyを指定してソートする (sorted関数)
# 0列目でソートする場合
sorted_data = sorted(data, key=lambda d: d[0])
print(f"sorted_data: {sorted_data}")
# 1列目でソートする場合
sorted_data = sorted(data, key=lambda d: d[1])
print(f"sorted_data: {sorted_data}")
# 2列目でソートする場合
sorted_data = sorted(data, key=lambda d: d[2])
print(f"sorted_data: {sorted_data}")
data = [
["ID002", "john", 70],
["ID001", "mike", 20],
["ID005", "jane", 1],
["ID004", "aiko", 50],
["ID003", "taro", 5],
]
# ===== keyを指定してソートする (sorted関数)
# 0列目でソートする場合
sorted_data = sorted(data, key=lambda d: d[0])
print(f"sorted_data: {sorted_data}")
# 1列目でソートする場合
sorted_data = sorted(data, key=lambda d: d[1])
print(f"sorted_data: {sorted_data}")
# 2列目でソートする場合
sorted_data = sorted(data, key=lambda d: d[2])
print(f"sorted_data: {sorted_data}")
sorted_data: [['ID001', 'mike', 20], ['ID002', 'john', 70], ['ID003', 'taro', 5], ['ID004', 'aiko', 50], ['ID005', 'jane', 1]]
sorted_data: [['ID004', 'aiko', 50], ['ID005', 'jane', 1], ['ID002', 'john', 70], ['ID001', 'mike', 20], ['ID003', 'taro', 5]]
sorted_data: [['ID005', 'jane', 1], ['ID003', 'taro', 5], ['ID001', 'mike',
20], ['ID004', 'aiko', 50], ['ID002', 'john', 70]]
【実行結果】
sorted_data: [['ID001', 'mike', 20], ['ID002', 'john', 70], ['ID003', 'taro', 5], ['ID004', 'aiko', 50], ['ID005', 'jane', 1]]
sorted_data: [['ID004', 'aiko', 50], ['ID005', 'jane', 1], ['ID002', 'john', 70], ['ID001', 'mike', 20], ['ID003', 'taro', 5]]
sorted_data: [['ID005', 'jane', 1], ['ID003', 'taro', 5], ['ID001', 'mike',
20], ['ID004', 'aiko', 50], ['ID002', 'john', 70]]
【実行結果】
sorted_data: [['ID001', 'mike', 20], ['ID002', 'john', 70], ['ID003', 'taro', 5], ['ID004', 'aiko', 50], ['ID005', 'jane', 1]]
sorted_data: [['ID004', 'aiko', 50], ['ID005', 'jane', 1], ['ID002', 'john', 70], ['ID001', 'mike', 20], ['ID003', 'taro', 5]]
sorted_data: [['ID005', 'jane', 1], ['ID003', 'taro', 5], ['ID001', 'mike',
20], ['ID004', 'aiko', 50], ['ID002', 'john', 70]]
辞書のリストデータ
{"id": "ID002", "name": "john", "value": 70},
{"id": "ID001", "name": "mike", "value": 20},
{"id": "ID005", "name": "jane", "value": 1},
{"id": "ID004", "name": "aiko", "value": 50},
{"id": "ID003", "name": "taro", "value": 5},
# ===== keyを指定してソートする (sortdメソッド)
sorted_data = sorted(data, key=lambda d: d["id"])
print(f"sorted_data: {sorted_data}")
sorted_data = sorted(data, key=lambda d: d["name"])
print(f"sorted_data: {sorted_data}")
sorted_data = sorted(data, key=lambda d: d["value"])
print(f"sorted_data: {sorted_data}")
data = [
{"id": "ID002", "name": "john", "value": 70},
{"id": "ID001", "name": "mike", "value": 20},
{"id": "ID005", "name": "jane", "value": 1},
{"id": "ID004", "name": "aiko", "value": 50},
{"id": "ID003", "name": "taro", "value": 5},
]
# ===== keyを指定してソートする (sortdメソッド)
# idでソートする場合
sorted_data = sorted(data, key=lambda d: d["id"])
print(f"sorted_data: {sorted_data}")
# nameでソートする場合
sorted_data = sorted(data, key=lambda d: d["name"])
print(f"sorted_data: {sorted_data}")
# valueでソートする場合
sorted_data = sorted(data, key=lambda d: d["value"])
print(f"sorted_data: {sorted_data}")
data = [
{"id": "ID002", "name": "john", "value": 70},
{"id": "ID001", "name": "mike", "value": 20},
{"id": "ID005", "name": "jane", "value": 1},
{"id": "ID004", "name": "aiko", "value": 50},
{"id": "ID003", "name": "taro", "value": 5},
]
# ===== keyを指定してソートする (sortdメソッド)
# idでソートする場合
sorted_data = sorted(data, key=lambda d: d["id"])
print(f"sorted_data: {sorted_data}")
# nameでソートする場合
sorted_data = sorted(data, key=lambda d: d["name"])
print(f"sorted_data: {sorted_data}")
# valueでソートする場合
sorted_data = sorted(data, key=lambda d: d["value"])
print(f"sorted_data: {sorted_data}")
sorted_data: [{'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID002',
'name': 'john', 'value': 70}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}]
sorted_data: [{'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005',
'name': 'jane', 'value': 1}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID003', 'name': 'taro', 'value': 5}]
sorted_data: [{'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID002', 'name': 'john',
【実行結果】
sorted_data: [{'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID002',
'name': 'john', 'value': 70}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}]
sorted_data: [{'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005',
'name': 'jane', 'value': 1}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID003', 'name': 'taro', 'value': 5}]
sorted_data: [{'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID002', 'name': 'john',
'value': 70}]
【実行結果】
sorted_data: [{'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID002',
'name': 'john', 'value': 70}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}]
sorted_data: [{'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005',
'name': 'jane', 'value': 1}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID003', 'name': 'taro', 'value': 5}]
sorted_data: [{'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID002', 'name': 'john',
'value': 70}]
クラスオブジェクトのリストデータ
def __init__(self, id, name, value) -> None:
def __repr__(self) -> str:
return repr((self.id, self.name, self.value))
Sample("ID002", "john", 70),
Sample("ID001", "mike", 20),
Sample("ID005", "jane", 1),
Sample("ID004", "aiko", 50),
Sample("ID003", "taro", 5),
# ===== keyを指定してソートする (sorted関数)
sorted_data = sorted(data, key=lambda d: d.id)
print(f"sorted_data: {sorted_data}")
sorted_data = sorted(data, key=lambda d: d.name)
print(f"sorted_data: {sorted_data}")
sorted_data = sorted(data, key=lambda d: d.value)
print(f"sorted_data: {sorted_data}")
class Sample:
"""サンプルクラス"""
def __init__(self, id, name, value) -> None:
self.id = id
self.name = name
self.value = value
def __repr__(self) -> str:
return repr((self.id, self.name, self.value))
data = [
Sample("ID002", "john", 70),
Sample("ID001", "mike", 20),
Sample("ID005", "jane", 1),
Sample("ID004", "aiko", 50),
Sample("ID003", "taro", 5),
]
# ===== keyを指定してソートする (sorted関数)
# id属性でソートする場合
sorted_data = sorted(data, key=lambda d: d.id)
print(f"sorted_data: {sorted_data}")
# name属性でソートする場合
sorted_data = sorted(data, key=lambda d: d.name)
print(f"sorted_data: {sorted_data}")
# value属性でソートする場合
sorted_data = sorted(data, key=lambda d: d.value)
print(f"sorted_data: {sorted_data}")
class Sample:
"""サンプルクラス"""
def __init__(self, id, name, value) -> None:
self.id = id
self.name = name
self.value = value
def __repr__(self) -> str:
return repr((self.id, self.name, self.value))
data = [
Sample("ID002", "john", 70),
Sample("ID001", "mike", 20),
Sample("ID005", "jane", 1),
Sample("ID004", "aiko", 50),
Sample("ID003", "taro", 5),
]
# ===== keyを指定してソートする (sorted関数)
# id属性でソートする場合
sorted_data = sorted(data, key=lambda d: d.id)
print(f"sorted_data: {sorted_data}")
# name属性でソートする場合
sorted_data = sorted(data, key=lambda d: d.name)
print(f"sorted_data: {sorted_data}")
# value属性でソートする場合
sorted_data = sorted(data, key=lambda d: d.value)
print(f"sorted_data: {sorted_data}")
sorted_data: [('ID001', 'mike', 20), ('ID002', 'john', 70), ('ID003', 'taro', 5), ('ID004', 'aiko', 50), ('ID005', 'jane', 1)]
sorted_data: [('ID004', 'aiko', 50), ('ID005', 'jane', 1), ('ID002', 'john', 70), ('ID001', 'mike', 20), ('ID003', 'taro', 5)]
sorted_data: [('ID005', 'jane', 1), ('ID003', 'taro', 5), ('ID001', 'mike',
20), ('ID004', 'aiko', 50), ('ID002', 'john', 70)]
【実行結果】
sorted_data: [('ID001', 'mike', 20), ('ID002', 'john', 70), ('ID003', 'taro', 5), ('ID004', 'aiko', 50), ('ID005', 'jane', 1)]
sorted_data: [('ID004', 'aiko', 50), ('ID005', 'jane', 1), ('ID002', 'john', 70), ('ID001', 'mike', 20), ('ID003', 'taro', 5)]
sorted_data: [('ID005', 'jane', 1), ('ID003', 'taro', 5), ('ID001', 'mike',
20), ('ID004', 'aiko', 50), ('ID002', 'john', 70)]
【実行結果】
sorted_data: [('ID001', 'mike', 20), ('ID002', 'john', 70), ('ID003', 'taro', 5), ('ID004', 'aiko', 50), ('ID005', 'jane', 1)]
sorted_data: [('ID004', 'aiko', 50), ('ID005', 'jane', 1), ('ID002', 'john', 70), ('ID001', 'mike', 20), ('ID003', 'taro', 5)]
sorted_data: [('ID005', 'jane', 1), ('ID003', 'taro', 5), ('ID001', 'mike',
20), ('ID004', 'aiko', 50), ('ID002', 'john', 70)]
複数キーで優先順位をつけてソートする場合
# ===== 複数keyを指定してソートする (sorted関数)
sorted_data = sorted(data, key=lambda d: (d[0], d[1]))
print(f"sorted data: {sorted_data}")
data = [
[3, 20, "b"],
[1, 20, "b"],
[2, 10, "a"],
[1, 10, "a"],
[2, 20, "b"],
[3, 10, "a"],
[1, 30, "c"],
[3, 30, "c"],
[2, 30, "c"],
]
# ===== 複数keyを指定してソートする (sorted関数)
sorted_data = sorted(data, key=lambda d: (d[0], d[1]))
print(f"sorted data: {sorted_data}")
data = [
[3, 20, "b"],
[1, 20, "b"],
[2, 10, "a"],
[1, 10, "a"],
[2, 20, "b"],
[3, 10, "a"],
[1, 30, "c"],
[3, 30, "c"],
[2, 30, "c"],
]
# ===== 複数keyを指定してソートする (sorted関数)
sorted_data = sorted(data, key=lambda d: (d[0], d[1]))
print(f"sorted data: {sorted_data}")
sorted data: [[1, 10, 'a'], [1, 20, 'b'], [1, 30, 'c'], [2, 10, 'a'], [2, 20, 'b'], [2, 30, 'c'], [3, 10, 'a'], [3, 20, 'b'], [3, 30, 'c']]
【実行結果】
sorted data: [[1, 10, 'a'], [1, 20, 'b'], [1, 30, 'c'], [2, 10, 'a'], [2, 20, 'b'], [2, 30, 'c'], [3, 10, 'a'], [3, 20, 'b'], [3, 30, 'c']]
【実行結果】
sorted data: [[1, 10, 'a'], [1, 20, 'b'], [1, 30, 'c'], [2, 10, 'a'], [2, 20, 'b'], [2, 30, 'c'], [3, 10, 'a'], [3, 20, 'b'], [3, 30, 'c']]
operatorモジュールの関数を使用したkeyの指定方法
上記で説明したlambda
関数を用いたkey
引数の指定は一般的に使われます。しかし、lambda
関数で指定しなくても高速で扱いやすい関数がoperator
モジュールで提供されています。
以降で具体的にoperator
モジュールのitemgetter
とattrgetter
の使い方を紹介します。
sortメソッドを使用する場合
リストのリスト (itemgetter)
sort
メソッドのkey
引数に指定する場合には、以下のようにitemgetter
を使用できます。
from operator import itemgetter
# ===== keyを指定してソートする (sortメソッド)
data.sort(key=itemgetter(0))
data.sort(key=itemgetter(1))
data.sort(key=itemgetter(2))
from operator import itemgetter
data = [
["ID002", "john", 70],
["ID001", "mike", 20],
["ID005", "jane", 1],
["ID004", "aiko", 50],
["ID003", "taro", 5],
]
# ===== keyを指定してソートする (sortメソッド)
# 0列目でソートする場合
data.sort(key=itemgetter(0))
print(f"data: {data}")
# 1列目でソートする場合
data.sort(key=itemgetter(1))
print(f"data: {data}")
# 2列目でソートする場合
data.sort(key=itemgetter(2))
print(f"data: {data}")
from operator import itemgetter
data = [
["ID002", "john", 70],
["ID001", "mike", 20],
["ID005", "jane", 1],
["ID004", "aiko", 50],
["ID003", "taro", 5],
]
# ===== keyを指定してソートする (sortメソッド)
# 0列目でソートする場合
data.sort(key=itemgetter(0))
print(f"data: {data}")
# 1列目でソートする場合
data.sort(key=itemgetter(1))
print(f"data: {data}")
# 2列目でソートする場合
data.sort(key=itemgetter(2))
print(f"data: {data}")
data: [['ID001', 'mike', 20], ['ID002', 'john', 70], ['ID003', 'taro', 5], ['ID004', 'aiko', 50], ['ID005', 'jane', 1]]
data: [['ID004', 'aiko', 50], ['ID005', 'jane', 1], ['ID002', 'john', 70], ['ID001', 'mike', 20], ['ID003', 'taro', 5]]
data: [['ID005', 'jane', 1], ['ID003', 'taro', 5], ['ID001', 'mike', 20], ['ID004', 'aiko', 50], ['ID002', 'john', 70]]
【実行結果】
data: [['ID001', 'mike', 20], ['ID002', 'john', 70], ['ID003', 'taro', 5], ['ID004', 'aiko', 50], ['ID005', 'jane', 1]]
data: [['ID004', 'aiko', 50], ['ID005', 'jane', 1], ['ID002', 'john', 70], ['ID001', 'mike', 20], ['ID003', 'taro', 5]]
data: [['ID005', 'jane', 1], ['ID003', 'taro', 5], ['ID001', 'mike', 20], ['ID004', 'aiko', 50], ['ID002', 'john', 70]]
【実行結果】
data: [['ID001', 'mike', 20], ['ID002', 'john', 70], ['ID003', 'taro', 5], ['ID004', 'aiko', 50], ['ID005', 'jane', 1]]
data: [['ID004', 'aiko', 50], ['ID005', 'jane', 1], ['ID002', 'john', 70], ['ID001', 'mike', 20], ['ID003', 'taro', 5]]
data: [['ID005', 'jane', 1], ['ID003', 'taro', 5], ['ID001', 'mike', 20], ['ID004', 'aiko', 50], ['ID002', 'john', 70]]
itemgetter
を使用する場合には、operator
からインポートが必要です。上記例のようにitemgetter
の引数に対象とするリストの列番号を入れれば、指定した値を基準にソートがされます。lambda
関数で指定するよりはシンプルに記載することができ、かつ高速です。
辞書のリストデータ (itemgetter)
辞書のリストデータの場合も、同様にitemgetter
を使用できます。
from operator import itemgetter
{"id": "ID002", "name": "john", "value": 70},
{"id": "ID001", "name": "mike", "value": 20},
{"id": "ID005", "name": "jane", "value": 1},
{"id": "ID004", "name": "aiko", "value": 50},
{"id": "ID003", "name": "taro", "value": 5},
# ===== keyを指定してソートする (sortメソッド)
data.sort(key=itemgetter("id"))
data.sort(key=itemgetter("name"))
data.sort(key=itemgetter("value"))
from operator import itemgetter
data = [
{"id": "ID002", "name": "john", "value": 70},
{"id": "ID001", "name": "mike", "value": 20},
{"id": "ID005", "name": "jane", "value": 1},
{"id": "ID004", "name": "aiko", "value": 50},
{"id": "ID003", "name": "taro", "value": 5},
]
# ===== keyを指定してソートする (sortメソッド)
# idでソートする場合
data.sort(key=itemgetter("id"))
print(f'data: {data}')
# nameでソートする場合
data.sort(key=itemgetter("name"))
print(f'data: {data}')
# valueでソートする場合
data.sort(key=itemgetter("value"))
print(f'data: {data}')
from operator import itemgetter
data = [
{"id": "ID002", "name": "john", "value": 70},
{"id": "ID001", "name": "mike", "value": 20},
{"id": "ID005", "name": "jane", "value": 1},
{"id": "ID004", "name": "aiko", "value": 50},
{"id": "ID003", "name": "taro", "value": 5},
]
# ===== keyを指定してソートする (sortメソッド)
# idでソートする場合
data.sort(key=itemgetter("id"))
print(f'data: {data}')
# nameでソートする場合
data.sort(key=itemgetter("name"))
print(f'data: {data}')
# valueでソートする場合
data.sort(key=itemgetter("value"))
print(f'data: {data}')
data: [{'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}]
data: [{'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID003', 'name': 'taro', 'value': 5}]
data: [{'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID003', 'name':
'taro', 'value': 5}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID002', 'name': 'john', 'value': 70}]
【実行結果】
data: [{'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}]
data: [{'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID003', 'name': 'taro', 'value': 5}]
data: [{'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID003', 'name':
'taro', 'value': 5}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID002', 'name': 'john', 'value': 70}]
【実行結果】
data: [{'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}]
data: [{'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID003', 'name': 'taro', 'value': 5}]
data: [{'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID003', 'name':
'taro', 'value': 5}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID002', 'name': 'john', 'value': 70}]
クラスオブジェクトのリストデータ (attrgetter)
クラスオブジェクトのリストデータの場合は、itemgetter
ではなくattrgetter
を使用します。
from operator import attrgetter
def __init__(self, id, name, value) -> None:
def __repr__(self) -> str:
return repr((self.id, self.name, self.value))
Sample("ID002", "john", 70),
Sample("ID001", "mike", 20),
Sample("ID005", "jane", 1),
Sample("ID004", "aiko", 50),
Sample("ID003", "taro", 5),
# ===== keyを指定してソートする (sortメソッド)
data.sort(key=attrgetter("id"))
data.sort(key=attrgetter("name"))
data.sort(key=attrgetter("value"))
from operator import attrgetter
class Sample:
"""サンプルクラス"""
def __init__(self, id, name, value) -> None:
self.id = id
self.name = name
self.value = value
def __repr__(self) -> str:
return repr((self.id, self.name, self.value))
data = [
Sample("ID002", "john", 70),
Sample("ID001", "mike", 20),
Sample("ID005", "jane", 1),
Sample("ID004", "aiko", 50),
Sample("ID003", "taro", 5),
]
# ===== keyを指定してソートする (sortメソッド)
# id属性でソートする場合
data.sort(key=attrgetter("id"))
print(f"data: {data}")
# name属性でソートする場合
data.sort(key=attrgetter("name"))
print(f"data: {data}")
# value属性でソートする場合
data.sort(key=attrgetter("value"))
print(f"data: {data}")
from operator import attrgetter
class Sample:
"""サンプルクラス"""
def __init__(self, id, name, value) -> None:
self.id = id
self.name = name
self.value = value
def __repr__(self) -> str:
return repr((self.id, self.name, self.value))
data = [
Sample("ID002", "john", 70),
Sample("ID001", "mike", 20),
Sample("ID005", "jane", 1),
Sample("ID004", "aiko", 50),
Sample("ID003", "taro", 5),
]
# ===== keyを指定してソートする (sortメソッド)
# id属性でソートする場合
data.sort(key=attrgetter("id"))
print(f"data: {data}")
# name属性でソートする場合
data.sort(key=attrgetter("name"))
print(f"data: {data}")
# value属性でソートする場合
data.sort(key=attrgetter("value"))
print(f"data: {data}")
data: [('ID001', 'mike', 20), ('ID002', 'john', 70), ('ID003', 'taro', 5), ('ID004', 'aiko', 50), ('ID005', 'jane', 1)]
data: [('ID004', 'aiko', 50), ('ID005', 'jane', 1), ('ID002', 'john', 70), ('ID001', 'mike', 20), ('ID003', 'taro', 5)]
data: [('ID005', 'jane', 1), ('ID003', 'taro', 5), ('ID001', 'mike', 20), ('ID004', 'aiko', 50), ('ID002', 'john', 70)]
【実行結果】
data: [('ID001', 'mike', 20), ('ID002', 'john', 70), ('ID003', 'taro', 5), ('ID004', 'aiko', 50), ('ID005', 'jane', 1)]
data: [('ID004', 'aiko', 50), ('ID005', 'jane', 1), ('ID002', 'john', 70), ('ID001', 'mike', 20), ('ID003', 'taro', 5)]
data: [('ID005', 'jane', 1), ('ID003', 'taro', 5), ('ID001', 'mike', 20), ('ID004', 'aiko', 50), ('ID002', 'john', 70)]
【実行結果】
data: [('ID001', 'mike', 20), ('ID002', 'john', 70), ('ID003', 'taro', 5), ('ID004', 'aiko', 50), ('ID005', 'jane', 1)]
data: [('ID004', 'aiko', 50), ('ID005', 'jane', 1), ('ID002', 'john', 70), ('ID001', 'mike', 20), ('ID003', 'taro', 5)]
data: [('ID005', 'jane', 1), ('ID003', 'taro', 5), ('ID001', 'mike', 20), ('ID004', 'aiko', 50), ('ID002', 'john', 70)]
attrgetter
を使用する場合には、operator
からインポートが必要です。itemgetter
同様に、attrgetter
の引数に対象とする属性名を指定します。
複数キーで優先順位をつけてソートする場合
itemgetter
やattrgetter
で複数キーで優先順位を指定する場合には、以下の例のように優先順位順に引数を指定します。
from operator import itemgetter
# ===== 複数keyを指定してソートする (sortメソッド)
data.sort(key=itemgetter(0, 1))
from operator import itemgetter
data = [
[3, 20, "b"],
[1, 20, "b"],
[2, 10, "a"],
[1, 10, "a"],
[2, 20, "b"],
[3, 10, "a"],
[1, 30, "c"],
[3, 30, "c"],
[2, 30, "c"],
]
# ===== 複数keyを指定してソートする (sortメソッド)
data.sort(key=itemgetter(0, 1))
print(f"data: {data}")
from operator import itemgetter
data = [
[3, 20, "b"],
[1, 20, "b"],
[2, 10, "a"],
[1, 10, "a"],
[2, 20, "b"],
[3, 10, "a"],
[1, 30, "c"],
[3, 30, "c"],
[2, 30, "c"],
]
# ===== 複数keyを指定してソートする (sortメソッド)
data.sort(key=itemgetter(0, 1))
print(f"data: {data}")
data: [[1, 10, 'a'], [1, 20, 'b'], [1, 30, 'c'], [2, 10, 'a'], [2, 20, 'b'], [2, 30, 'c'], [3, 10, 'a'], [3, 20, 'b'], [3, 30, 'c']]
【実行結果】
data: [[1, 10, 'a'], [1, 20, 'b'], [1, 30, 'c'], [2, 10, 'a'], [2, 20, 'b'], [2, 30, 'c'], [3, 10, 'a'], [3, 20, 'b'], [3, 30, 'c']]
【実行結果】
data: [[1, 10, 'a'], [1, 20, 'b'], [1, 30, 'c'], [2, 10, 'a'], [2, 20, 'b'], [2, 30, 'c'], [3, 10, 'a'], [3, 20, 'b'], [3, 30, 'c']]
sorted関数を使用する場合
sorted
関数についても、key
引数に指定する方法はsort
メソッドと同じです。sort
メソッドで紹介した例のsorted
関数版について以下にソースと結果を紹介します。
リストのリストデータ (itemgetter)
from operator import itemgetter
# ===== keyを指定してソートする (sorted関数)
sorted_data = sorted(data, key=itemgetter(0))
print(f"sorted_data: {sorted_data}")
sorted_data = sorted(data, key=itemgetter(1))
print(f"sorted_data: {sorted_data}")
sorted_data = sorted(data, key=itemgetter(2))
print(f"sorted_data: {sorted_data}")
from operator import itemgetter
data = [
["ID002", "john", 70],
["ID001", "mike", 20],
["ID005", "jane", 1],
["ID004", "aiko", 50],
["ID003", "taro", 5],
]
# ===== keyを指定してソートする (sorted関数)
# 0列目でソートする場合
sorted_data = sorted(data, key=itemgetter(0))
print(f"sorted_data: {sorted_data}")
# 1列目でソートする場合
sorted_data = sorted(data, key=itemgetter(1))
print(f"sorted_data: {sorted_data}")
# 2列目でソートする場合
sorted_data = sorted(data, key=itemgetter(2))
print(f"sorted_data: {sorted_data}")
from operator import itemgetter
data = [
["ID002", "john", 70],
["ID001", "mike", 20],
["ID005", "jane", 1],
["ID004", "aiko", 50],
["ID003", "taro", 5],
]
# ===== keyを指定してソートする (sorted関数)
# 0列目でソートする場合
sorted_data = sorted(data, key=itemgetter(0))
print(f"sorted_data: {sorted_data}")
# 1列目でソートする場合
sorted_data = sorted(data, key=itemgetter(1))
print(f"sorted_data: {sorted_data}")
# 2列目でソートする場合
sorted_data = sorted(data, key=itemgetter(2))
print(f"sorted_data: {sorted_data}")
sorted_data: [['ID001', 'mike', 20], ['ID002', 'john', 70], ['ID003', 'taro', 5], ['ID004', 'aiko', 50], ['ID005', 'jane', 1]]
sorted_data: [['ID004', 'aiko', 50], ['ID005', 'jane', 1], ['ID002', 'john', 70], ['ID001', 'mike', 20], ['ID003', 'taro', 5]]
sorted_data: [['ID005', 'jane', 1], ['ID003', 'taro', 5], ['ID001', 'mike',
20], ['ID004', 'aiko', 50], ['ID002', 'john', 70]]
【実行結果】
sorted_data: [['ID001', 'mike', 20], ['ID002', 'john', 70], ['ID003', 'taro', 5], ['ID004', 'aiko', 50], ['ID005', 'jane', 1]]
sorted_data: [['ID004', 'aiko', 50], ['ID005', 'jane', 1], ['ID002', 'john', 70], ['ID001', 'mike', 20], ['ID003', 'taro', 5]]
sorted_data: [['ID005', 'jane', 1], ['ID003', 'taro', 5], ['ID001', 'mike',
20], ['ID004', 'aiko', 50], ['ID002', 'john', 70]]
【実行結果】
sorted_data: [['ID001', 'mike', 20], ['ID002', 'john', 70], ['ID003', 'taro', 5], ['ID004', 'aiko', 50], ['ID005', 'jane', 1]]
sorted_data: [['ID004', 'aiko', 50], ['ID005', 'jane', 1], ['ID002', 'john', 70], ['ID001', 'mike', 20], ['ID003', 'taro', 5]]
sorted_data: [['ID005', 'jane', 1], ['ID003', 'taro', 5], ['ID001', 'mike',
20], ['ID004', 'aiko', 50], ['ID002', 'john', 70]]
辞書のリストデータ (itemgetter)
from operator import itemgetter
{"id": "ID002", "name": "john", "value": 70},
{"id": "ID001", "name": "mike", "value": 20},
{"id": "ID005", "name": "jane", "value": 1},
{"id": "ID004", "name": "aiko", "value": 50},
{"id": "ID003", "name": "taro", "value": 5},
# ===== keyを指定してソートする (sortdメソッド)
sorted_data = sorted(data, key=itemgetter("id"))
print(f"sorted_data: {sorted_data}")
sorted_data = sorted(data, key=itemgetter("name"))
print(f"sorted_data: {sorted_data}")
sorted_data = sorted(data, key=itemgetter("value"))
print(f"sorted_data: {sorted_data}")
from operator import itemgetter
data = [
{"id": "ID002", "name": "john", "value": 70},
{"id": "ID001", "name": "mike", "value": 20},
{"id": "ID005", "name": "jane", "value": 1},
{"id": "ID004", "name": "aiko", "value": 50},
{"id": "ID003", "name": "taro", "value": 5},
]
# ===== keyを指定してソートする (sortdメソッド)
# idでソートする場合
sorted_data = sorted(data, key=itemgetter("id"))
print(f"sorted_data: {sorted_data}")
# nameでソートする場合
sorted_data = sorted(data, key=itemgetter("name"))
print(f"sorted_data: {sorted_data}")
# valueでソートする場合
sorted_data = sorted(data, key=itemgetter("value"))
print(f"sorted_data: {sorted_data}")
from operator import itemgetter
data = [
{"id": "ID002", "name": "john", "value": 70},
{"id": "ID001", "name": "mike", "value": 20},
{"id": "ID005", "name": "jane", "value": 1},
{"id": "ID004", "name": "aiko", "value": 50},
{"id": "ID003", "name": "taro", "value": 5},
]
# ===== keyを指定してソートする (sortdメソッド)
# idでソートする場合
sorted_data = sorted(data, key=itemgetter("id"))
print(f"sorted_data: {sorted_data}")
# nameでソートする場合
sorted_data = sorted(data, key=itemgetter("name"))
print(f"sorted_data: {sorted_data}")
# valueでソートする場合
sorted_data = sorted(data, key=itemgetter("value"))
print(f"sorted_data: {sorted_data}")
sorted_data: [{'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID002',
'name': 'john', 'value': 70}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}]
sorted_data: [{'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005',
'name': 'jane', 'value': 1}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID003', 'name': 'taro', 'value': 5}]
sorted_data: [{'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID002', 'name': 'john',
【実行結果】
sorted_data: [{'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID002',
'name': 'john', 'value': 70}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}]
sorted_data: [{'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005',
'name': 'jane', 'value': 1}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID003', 'name': 'taro', 'value': 5}]
sorted_data: [{'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID002', 'name': 'john',
'value': 70}]
【実行結果】
sorted_data: [{'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID002',
'name': 'john', 'value': 70}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005', 'name': 'jane', 'value': 1}]
sorted_data: [{'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID005',
'name': 'jane', 'value': 1}, {'id': 'ID002', 'name': 'john', 'value': 70}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID003', 'name': 'taro', 'value': 5}]
sorted_data: [{'id': 'ID005', 'name': 'jane', 'value': 1}, {'id': 'ID003', 'name': 'taro', 'value': 5}, {'id': 'ID001', 'name': 'mike', 'value': 20}, {'id': 'ID004', 'name': 'aiko', 'value': 50}, {'id': 'ID002', 'name': 'john',
'value': 70}]
クラスオブジェクトのリストデータ (attrgetter)
from operator import attrgetter
def __init__(self, id, name, value) -> None:
def __repr__(self) -> str:
return repr((self.id, self.name, self.value))
Sample("ID002", "john", 70),
Sample("ID001", "mike", 20),
Sample("ID005", "jane", 1),
Sample("ID004", "aiko", 50),
Sample("ID003", "taro", 5),
# ===== keyを指定してソートする (sorted関数)
sorted_data = sorted(data, key=attrgetter("id"))
print(f"sorted_data: {sorted_data}")
sorted_data = sorted(data, key=attrgetter("name"))
print(f"sorted_data: {sorted_data}")
sorted_data = sorted(data, key=attrgetter("value"))
print(f"sorted_data: {sorted_data}")
from operator import attrgetter
class Sample:
"""サンプルクラス"""
def __init__(self, id, name, value) -> None:
self.id = id
self.name = name
self.value = value
def __repr__(self) -> str:
return repr((self.id, self.name, self.value))
data = [
Sample("ID002", "john", 70),
Sample("ID001", "mike", 20),
Sample("ID005", "jane", 1),
Sample("ID004", "aiko", 50),
Sample("ID003", "taro", 5),
]
# ===== keyを指定してソートする (sorted関数)
# id属性でソートする場合
sorted_data = sorted(data, key=attrgetter("id"))
print(f"sorted_data: {sorted_data}")
# name属性でソートする場合
sorted_data = sorted(data, key=attrgetter("name"))
print(f"sorted_data: {sorted_data}")
# value属性でソートする場合
sorted_data = sorted(data, key=attrgetter("value"))
print(f"sorted_data: {sorted_data}")
from operator import attrgetter
class Sample:
"""サンプルクラス"""
def __init__(self, id, name, value) -> None:
self.id = id
self.name = name
self.value = value
def __repr__(self) -> str:
return repr((self.id, self.name, self.value))
data = [
Sample("ID002", "john", 70),
Sample("ID001", "mike", 20),
Sample("ID005", "jane", 1),
Sample("ID004", "aiko", 50),
Sample("ID003", "taro", 5),
]
# ===== keyを指定してソートする (sorted関数)
# id属性でソートする場合
sorted_data = sorted(data, key=attrgetter("id"))
print(f"sorted_data: {sorted_data}")
# name属性でソートする場合
sorted_data = sorted(data, key=attrgetter("name"))
print(f"sorted_data: {sorted_data}")
# value属性でソートする場合
sorted_data = sorted(data, key=attrgetter("value"))
print(f"sorted_data: {sorted_data}")
sorted_data: [('ID001', 'mike', 20), ('ID002', 'john', 70), ('ID003', 'taro', 5), ('ID004', 'aiko', 50), ('ID005', 'jane', 1)]
sorted_data: [('ID004', 'aiko', 50), ('ID005', 'jane', 1), ('ID002', 'john', 70), ('ID001', 'mike', 20), ('ID003', 'taro', 5)]
sorted_data: [('ID005', 'jane', 1), ('ID003', 'taro', 5), ('ID001', 'mike',
20), ('ID004', 'aiko', 50), ('ID002', 'john', 70)]
【実行結果】
sorted_data: [('ID001', 'mike', 20), ('ID002', 'john', 70), ('ID003', 'taro', 5), ('ID004', 'aiko', 50), ('ID005', 'jane', 1)]
sorted_data: [('ID004', 'aiko', 50), ('ID005', 'jane', 1), ('ID002', 'john', 70), ('ID001', 'mike', 20), ('ID003', 'taro', 5)]
sorted_data: [('ID005', 'jane', 1), ('ID003', 'taro', 5), ('ID001', 'mike',
20), ('ID004', 'aiko', 50), ('ID002', 'john', 70)]
【実行結果】
sorted_data: [('ID001', 'mike', 20), ('ID002', 'john', 70), ('ID003', 'taro', 5), ('ID004', 'aiko', 50), ('ID005', 'jane', 1)]
sorted_data: [('ID004', 'aiko', 50), ('ID005', 'jane', 1), ('ID002', 'john', 70), ('ID001', 'mike', 20), ('ID003', 'taro', 5)]
sorted_data: [('ID005', 'jane', 1), ('ID003', 'taro', 5), ('ID001', 'mike',
20), ('ID004', 'aiko', 50), ('ID002', 'john', 70)]
複数キーで優先順位をつけてソートする場合
from operator import itemgetter
# ===== 複数keyを指定してソートする (sort関数)
sorted_data = sorted(data, key=itemgetter(0, 1))
print(f"sorted data: {sorted_data}")
from operator import itemgetter
data = [
[3, 20, "b"],
[1, 20, "b"],
[2, 10, "a"],
[1, 10, "a"],
[2, 20, "b"],
[3, 10, "a"],
[1, 30, "c"],
[3, 30, "c"],
[2, 30, "c"],
]
# ===== 複数keyを指定してソートする (sort関数)
sorted_data = sorted(data, key=itemgetter(0, 1))
print(f"sorted data: {sorted_data}")
from operator import itemgetter
data = [
[3, 20, "b"],
[1, 20, "b"],
[2, 10, "a"],
[1, 10, "a"],
[2, 20, "b"],
[3, 10, "a"],
[1, 30, "c"],
[3, 30, "c"],
[2, 30, "c"],
]
# ===== 複数keyを指定してソートする (sort関数)
sorted_data = sorted(data, key=itemgetter(0, 1))
print(f"sorted data: {sorted_data}")
sorted data: [[1, 10, 'a'], [1, 20, 'b'], [1, 30, 'c'], [2, 10, 'a'], [2, 20, 'b'], [2, 30, 'c'], [3, 10, 'a'], [3, 20, 'b'], [3, 30, 'c']]
【実行結果】
sorted data: [[1, 10, 'a'], [1, 20, 'b'], [1, 30, 'c'], [2, 10, 'a'], [2, 20, 'b'], [2, 30, 'c'], [3, 10, 'a'], [3, 20, 'b'], [3, 30, 'c']]
【実行結果】
sorted data: [[1, 10, 'a'], [1, 20, 'b'], [1, 30, 'c'], [2, 10, 'a'], [2, 20, 'b'], [2, 30, 'c'], [3, 10, 'a'], [3, 20, 'b'], [3, 30, 'c']]
まとめ
Pythonのリスト(list
)を並べ替える方法(sort
メソッド、sorted
関数)の基本的な使い方について解説しました。また、key
引数でキーを指定してソートする方法についても説明しました。
key
引数の指定方法については、一般的によく使われるlambda
関数を使った指定方法と、Pythonのoperator
モジュールのitemgetter
やattrgetter
を用いた方法を紹介しました。いずれでも実装ができますが、operator
モジュールでの実装はシンプルかつ高速です。
リストのソートはプログラミングでは非常によく行う操作です。うまく使いこなせるようにしましょう。
ソースコード
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。