This article is available in: English
pythonのソートをする際に指定できる、引数keyについての備忘録です。
keyを指定してソート
sorted関数の引数keyに、ラムダ式を用いてソートしたい要素を指定することで、その要素でソートしたリストが取得できます。
# 成績のリスト
before = [
['Chris', 90], ['Bob', 70], ['Alice', 80]
]
# 点数でソート
after = sorted(before, key=lambda x: x[1])
print(f'before: {before}')
print(f'after: {after}')
出力
before: [['Chris', 90], ['Bob', 70], ['Alice', 80]]
after: [['Bob', 70], ['Alice', 80], ['Chris', 90]]
2つのkeyでソート
2つのkeyを指定してソートすることもできます。つまり、1つ目の要素でソートし、同じ要素の時に2つ目の要素でソートする場合です。この場合は、ラムダ式の部分をタプル()で囲みます。
# 成績のリスト
before = [
['Bob', 70], ['Alice', 80], ['Chris', 90], ['Alice', 95], ['Chris', 69], ['Bob', 94]
]
# 名前でソートし、同じ名前の場合は点数でソートする
after = sorted(before, key=lambda x: (x[0], x[1]))
print(f'before: {before}')
print(f'abter: {after}')
出力
before: [['Bob', 70], ['Alice', 80], ['Chris', 90], ['Alice', 95], ['Chris', 69], ['Bob', 94]]
after: [['Alice', 80], ['Alice', 95], ['Bob', 70], ['Bob', 94], ['Chris', 69], ['Chris', 90]]
上記を応用して、
[‘20210514_2.csv’, ‘20210512_1.csv’, ‘20210516_1.csv’, ‘20210514_1.csv’]
といったリストを次の規則でソートしてみます。
- リスト内のファイル名を日付を基準に古い順にソートする。
- 同じ日付のファイルの場合は、接尾子が小さい順にソートする。
from datetime import datetime
before = [
'20210514_2.csv', '20210512_1.csv', '20210516_1.csv', '20210514_1.csv'
]
def get_datetime(filename):
"""ファイル名の日付部分をdatetimeで返却"""
date_str = filename.split('_')[0]
return datetime.strptime(date_str, '%Y%m%d')
def get_suffix(filename):
"""ファイル名の接尾子を返却"""
suffix = filename.split('.')[0].split('_')[1]
return suffix
after = sorted(before, key=lambda x: (get_datetime(x), get_suffix(x)))
print(f'before: {before}')
print(f'after: {after}')
出力
before: ['20210514_2.csv', '20210512_1.csv', '20210516_1.csv', '20210514_1.csv']
after: ['20210512_1.csv', '20210514_1.csv', '20210514_2.csv', '20210516_1.csv']