リストの中のdatetime型を基準に並び替え(ソート)をする方法
WEBスクレイピングで得たデータは最新の情報が上の方にあり、古いデータが下にある、
もしくは古い情報になればなるほど、次のページや深いページにあるということが一般的です。
そんなデータを取得するとこんな感じになります。
from datetime import datetime as dt
from pprint import pprint
sale = []
sale.append(['モンスターエナジー', '210', '1', dt(2018, 1, 20)])
sale.append(['リンゴジュース', '120', '1', dt(2018, 1, 18)])
sale.append(['レッドブル', '250', '1', dt(2018, 1, 6)])
sale.append(['ジョージアエメラルドマウンテン', '100', '1', dt(2018, 1, 5)])
pprint(sale)
# [['モンスターエナジー', '210', '1', datetime.datetime(2018, 1, 20, 0, 0)],
# ['リンゴジュース', '120', '1', datetime.datetime(2018, 1, 18, 0, 0)],
# ['レッドブル', '250', '1', datetime.datetime(2018, 1, 6, 0, 0)],
# ['ジョージアエメラルドマウンテン', '100', '1', datetime.datetime(2018, 1, 5, 0, 0)]]
定期的にデータを取得して、データベースに保存する場合は、
古いデータから登録していきたいところなんですが、
WEBスクレイピングしてきたままのデータだと新しいデータから古いデータへと登録がされていってしまいますね。
ですので、このリストを並び替えてから、データベースに登録していけば
古いデータから順に登録していくことができます。
並び替えるのは sorted()
を利用します。
デフォルトでは昇順に並び替えされます。
降順に並び替えたい場合は引数に reverse=True
を追加します。
datetime型でも簡単に並び替えできます。
from datetime import datetime as dt
from pprint import pprint
sale = []
sale.append(['モンスターエナジー', '210', '1', dt(2018, 1, 20)])
sale.append(['リンゴジュース', '120', '1', dt(2018, 1, 18)])
sale.append(['レッドブル', '250', '1', dt(2018, 1, 6)])
sale.append(['ジョージアエメラルドマウンテン', '100', '1', dt(2018, 1, 5)])
# sample
pprint(sale)
# result1 日付の古い順で並び替え(datetime型)
sorted_sale = sorted(sale, key=lambda s: s[3])
pprint(sorted_sale)
# result2 値段が高い順(降順)に並び替え
sorted_sale = sorted(sale, key=lambda s: int(s[1]), reverse=True)
pprint(sorted_sale)
# sample
# [['モンスターエナジー', '210', '1', datetime.datetime(2018, 1, 20, 0, 0)],
# ['リンゴジュース', '120', '1', datetime.datetime(2018, 1, 18, 0, 0)],
# ['レッドブル', '250', '1', datetime.datetime(2018, 1, 6, 0, 0)],
# ['ジョージアエメラルドマウンテン', '100', '1', datetime.datetime(2018, 1, 5, 0, 0)]]
# result1
# [['ジョージアエメラルドマウンテン', '100', '1', datetime.datetime(2018, 1, 5, 0, 0)],
# ['レッドブル', '250', '1', datetime.datetime(2018, 1, 6, 0, 0)],
# ['リンゴジュース', '120', '1', datetime.datetime(2018, 1, 18, 0, 0)],
# ['モンスターエナジー', '210', '1', datetime.datetime(2018, 1, 20, 0, 0)]]
# result2
# [['レッドブル', '250', '1', datetime.datetime(2018, 1, 6, 0, 0)],
# ['モンスターエナジー', '210', '1', datetime.datetime(2018, 1, 20, 0, 0)],
# ['リンゴジュース', '120', '1', datetime.datetime(2018, 1, 18, 0, 0)],
# ['ジョージアエメラルドマウンテン', '100', '1', datetime.datetime(2018, 1, 5, 0, 0)]]