2013-07-13 19 views
15

Ho un elenco arbitrario di stringhe di data (mm-aaaa) come segue:Ordina lista di stringhe di data

d = ['09-2012', '04-2007', '11-2012', '05-2013', '12-2006', '05-2006', '08-2007'...] 

ho bisogno di questo elenco per essere ordinati prima dal livello di anni (crescente), poi su il livello dei mesi (crescente) .. in modo che l'ordinamento logico può essere:

d_ordered = ['05-2006', '12-2006', '04-2007', '08-2007', '09-2012', '11-2012', '05-2013' ...] 

Come posso ottenere questo?

+3

veloce e sporco: 'd.sort (key = lambda x: x.split ('-') [:: - 1]) ' –

risposta

34

Prova questo:

import datetime 
d = ['09-2012', '04-2007', '11-2012', '05-2013', '12-2006', '05-2006', '08-2007'] 
sorted(d, key=lambda x: datetime.datetime.strptime(x, '%m-%Y')) 
5

Usa sorted() con una chiave:

>>> d = ['09-2012', '04-2007', '11-2012', '05-2013', '12-2006', '05-2006', '08-2007'] 
>>> def sorting(L): 
...  splitup = L.split('-') 
...  return splitup[1], splitup[0] 
... 
>>> sorted(d, key=sorting) 
['05-2006', '12-2006', '04-2007', '08-2007', '09-2012', '11-2012', '05-2013'] 

E 'meglio utilizzare una funzione qui invece di un lambda per evitare di chiamare split() due volte (e sembra un po' più ordinato :))

Si noti che questo restituirà la lista ordinata. Se si desidera ordinare al suo posto, utilizzare .sort():

>>> d.sort(key=sorting) 
>>> d 
['05-2006', '12-2006', '04-2007', '08-2007', '09-2012', '11-2012', '05-2013']