【Python】sortする時の引数keyについて

プログラミング

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’]
といったリストを次の規則でソートしてみます。

  1. リスト内のファイル名を日付を基準に古い順にソートする。
  2. 同じ日付のファイルの場合は、接尾子が小さい順にソートする。
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']

タイトルとURLをコピーしました