cre8cre8
AskMe♥

Pythonのリスト(配列)で、文字列の日付(日時)を基準にソートしようとしたときの、備忘録

python
1data = [
2    ['これ', '2015-03-20', 'this'],
3    ['あれ', '2015-02-10', 'that'],
4    ['それ', '2015-03-15', 'it']
5]

上記のようなデータで、
文字列の日付(日時)を基準にソートしたいと思いました。

python
1data = [
2    ['これ', '2015-03-20', 'this'],
3    ['あれ', '2015-02-10', 'that'],
4    ['それ', '2015-03-15', 'it']
5]
6
7sort_data = sorted(data, key=lambda x: x[1])
8
9print (sort_data) # [['あれ', '2015-02-10', 'that'], ['それ', '2015-03-15', 'it'], ['これ', '2015-03-20', 'this']]

なんてことはない。これでうまくいった。
これだと、ただの文字列を比較しているので、
ちゃんと日付のデータとして比較したい。

なので、改良してみた。

python
1import datetime
2
3def str2date(d):
4    tmp = datetime.datetime.strptime(d, '%Y-%m-%d')
5    return datetime.date(tmp.year, tmp.month, tmp.day)
6
7data = [
8    ['これ', '2015-11-20', 'this'],
9    ['あれ', '2015-12-10', 'that'],
10    ['それ', '2016-11-15', 'it']
11]
12
13sort_data = sorted(data, key=lambda x: str2date(x[1]))
14
15print (sort_data) # [['これ', '2015-11-20', 'this'], ['あれ', '2015-12-10', 'that'], ['それ', '2016-11-15', 'it']]

なんてことはない。これでもうまくいった。
これだと、関数が増えてしまうので、
ちゃんとlambdaの中で完結してほしい。

なので、改良してみた。

python
1import datetime
2
3data = [
4    ['これ', '2015-11-20', 'this'],
5    ['あれ', '2015-12-10', 'that'],
6    ['それ', '2016-11-15', 'it']
7]
8
9sort_data = sorted(data, key=lambda x: datetime.date(datetime.datetime.strptime(x[1], '%Y-%m-%d').year, datetime.datetime.strptime(x[1], '%Y-%m-%d').month, datetime.datetime.strptime(x[1], '%Y-%m-%d').day)
10 )
11
12print (sort_data) # [['これ', '2015-11-20', 'this'], ['あれ', '2015-12-10', 'that'], ['それ', '2016-11-15', 'it']]

なんてことはない。これで更にうまくいった。

うう…これで勘弁してください…(´;ω;`)


Python3で確認していますが、Python2はユニコードのエラーが出ます。
なので、 # coding:utf-8 をプログラム先頭に記述してください。
print (sort_data) のところで化けますが動きます。

≪ 前の記事
sh -c で実行したコマンドのログ出力方法
〜teeの優しく右手添え〜
次の記事 ≫
cre8cre8なJavaScript入門
~はじめてのJavaScriptで文字を装飾しよう~

いいねやコメントを送っていただけると中の人がしっぽ振って大喜びします♪

あなたへのおすすめの記事