[英]Python - Itemgetter on Dates
from operator import itemgetter
a=[['','27/01/2014'],['','28/01/2014'],['','29/01/2014'],['','30/01/2014'],['','31/01/2014'],['','01/02/2014'],['','02/02/2014']]
b=sorted(a,key=itemgetter(-1))
輸出:
[['', '01/02/2014'], ['', '02/02/2014'], ['', '27/01/2014'], ['', '28/01/2014'], ['', '29/01/2014'], ['', '30/01/2014'], ['', '31/01/2014']]
為什么itemgetter會產生此結果?
我在示例中知道日期是按升序排列的,但是假設它們不是,是否有一個函數可以簡單地做到這一點?
日期存儲為字符串,因此按字典順序進行排序。 如果要將其排序為日期,則應使用datetime.strptime
:
import datetime
b=sorted(a,key=lambda x:datetime.datetime.strptime(x[-1], '%d/%m/%Y'))
輸出:
[['', '27/01/2014'], ['', '28/01/2014'], ['', '29/01/2014'], ['', '30/01/2014'], ['', '31/01/2014'], ['', '01/02/2014'], ['', '02/02/2014']]
按照您的要求對它們進行排序。 當然,您的日期是字符串,並且字符串按字典順序排序。 如果您的日期為ISO 8601格式,則這僅等效於日期的自然排序順序。 你不是。
嘗試通過將其轉換為key
函數中的datetime
對象進行排序:
sorted(a,key=lambda x: datetime.strptime(x[1],'%d/%m/%Y'))
Out[18]:
[['', '27/01/2014'],
['', '28/01/2014'],
['', '29/01/2014'],
['', '30/01/2014'],
['', '31/01/2014'],
['', '01/02/2014'],
['', '02/02/2014']]
你那里沒有約會。 你碰巧包含日期的字符串表示的字符串 。 這樣,當您按字符串排序時,就是使用標准詞典順序對其進行排序 。
如果要按日期排序,則實際上需要解釋這些字符串。 例如,使用datetime:
>>> a = [['','27/01/2014'],['','28/01/2014'],['','29/01/2014'],['','30/01/2014'],['','31/01/2014'],['','01/02/2014'],['','02/02/2014']]
>>> a.sort(key=lambda x: datetime.strptime(x[-1], '%d/%m/%Y'))
>>> a
[['', '27/01/2014'], ['', '28/01/2014'], ['', '29/01/2014'], ['', '30/01/2014'], ['', '31/01/2014'], ['', '01/02/2014'], ['', '02/02/2014']]
如果您想使用日期,則將它們轉換為日期時間對象可能是一個好主意:
>>> b = [[a, datetime.strptime(b, '%d/%m/%Y')] for a, b in a]
>>> b
[['', datetime.datetime(2014, 1, 27, 0, 0)], ['', datetime.datetime(2014, 1, 28, 0, 0)], ['', datetime.datetime(2014, 1, 29, 0, 0)], ['', datetime.datetime(2014, 1, 30, 0, 0)], ['', datetime.datetime(2014, 1, 31, 0, 0)], ['', datetime.datetime(2014, 2, 1, 0, 0)], ['', datetime.datetime(2014, 2, 2, 0, 0)]]
然后,您還可以使用itemgetter
:
>>> from operator import itemgetter
>>> b.sort(key=itemgetter(-1))
>>> b
[['', datetime.datetime(2014, 1, 27, 0, 0)], ['', datetime.datetime(2014, 1, 28, 0, 0)], ['', datetime.datetime(2014, 1, 29, 0, 0)], ['', datetime.datetime(2014, 1, 30, 0, 0)], ['', datetime.datetime(2014, 1, 31, 0, 0)], ['', datetime.datetime(2014, 2, 1, 0, 0)], ['', datetime.datetime(2014, 2, 2, 0, 0)]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.