2013-06-18 47 views
1

排序列表的Python列表,我需要按日期排序列表的列表:從本網站我需要按日期

mylist=['ML-M01 Qual Report 07/31/13', 'ML36220010 Complete Qual Testing 07/24/13', 'ML36220045 Final FRB 07/13/13', 'ML9822D2600 Brief to PM 08/5/13'] 

,我得到這個代碼:

sorted(mylist, key=lambda x: datetime.datetime.strptime(x[2], '%m/%d/%y')) 

然而,我得到這個錯誤信息:

sorted(mylist,key=lambda x: datetime.datetime.strptime(x[2], '%m/%d/%y')) 
Traceback (most recent call last): 
    File "<pyshell#25>", line 1, in <module> 
    sorted(mylist,key=lambda x: datetime.datetime.strptime(x[2], '%m/%d/%y')) 
    File "<pyshell#25>", line 1, in <lambda> 
    sorted(mylist,key=lambda x: datetime.datetime.strptime(x[2], '%m/%d/%y')) 
    File "C:\Python25\Lib\_strptime.py", line 330, in strptime 
    (data_string, format)) 
ValueError: time data did not match format: data=- fmt=%m/%d/%y 

需要幫助 - 需要由3D元素進行排序列表 - 最舊到最新

回答

6

列表中的每個條目都是一個字符串,而不是一個列表,因此x[2]是單個字符(您的第一個條目爲'-')。你需要只是日期部分分裂出去strptime()

sorted(mylist, key=lambda x: datetime.datetime.strptime(x.rsplit(None, 1)[-1], '%m/%d/%y')) 

str.rsplit()按空白進行分割,一次,爲了提高效率:

>>> 'ML-M01 Qual Report 07/31/13'.rsplit(None, 1) 
['ML-M01 Qual Report', '07/31/13'] 
>>> 'ML-M01 Qual Report 07/31/13'.rsplit(None, 1)[-1] 
'07/31/13' 

結果:

>>> sorted(mylist, key=lambda x: datetime.datetime.strptime(x.rsplit(None, 1)[-1], '%m/%d/%y')) 
['ML36220045 Final FRB 07/13/13', 'ML36220010 Complete Qual Testing 07/24/13', 'ML-M01 Qual Report 07/31/13', 'ML9822D2600 Brief to PM 08/5/13'] 

請注意,sorted()返回一個新的排序列表,即原始列表不受影響。如果要排序mylist到位,調用其list.sort()方法:

mylist.sort(key=lambda x: datetime.datetime.strptime(x.rsplit(None, 1)[-1], '%m/%d/%y')) 
+0

沒有得到一個排序列表:我的代碼: – Glen

+0

爲您的樣品輸入,我得到有序輸出。你想排序mylist嗎? –

+0

明白了。我不太瞭解代碼,但它非常棒!謝謝 – Glen

2

你的錯誤:

ValueError: time data did not match format: data=- fmt=%m/%d/%y 

表示你得到的數據"-"這不是一個日期。這表明您的列表中有不包含有效日期的行。

該解決方案通過返回None來處理無效日期。這會把所有無效的日期一起:

import datetime 

mylist=['ML-M01 Qual Report 07/31/13', 'ML36220010 Complete Qual Testing 07/24/13', 'ML36220045 Final FRB 07/13/13', 'ML9822D2600 Brief to PM 08/5/13'] 

def extract_date(text): 
    try: 
     return datetime.datetime.strptime(text.rsplit(None, 1)[-1], '%m/%d/%y') 
    except ValueError: 
     return None 

mylist.sort(key=extract_date) 

print mylist 

輸出:

['ML36220045 Final FRB 07/13/13', 
'ML36220010 Complete Qual Testing 07/24/13', 
'ML-M01 Qual Report 07/31/13', 
'ML9822D2600 Brief to PM 08/5/13'] 
相關問題