2017-12-17 3 views
3

Ich habe eine Liste von Listen, die etwa wie folgt aussieht:sortierte Liste von Listen ersten Jahr, dann von Monat

dateList = [['2014', '4'], ['2015', '6'], ['2017', '6'], ['2016', '2'], ['2016', '3'], ['2017', '9'], ['2016', '6'], ['2017', '3'], ['2014', '8'], ['2014', '10'], ['2017', '10'], ['2014', '9'], ['2014', '3'], ['2015', '11'], ['2015', '2']] 

ich versucht habe, es zuerst von Jahr zu sortieren und dann von Monat. Ich habe in der Sortierung es nach Jahren mit

sortedList = sorted(dateList, key = lambda x: int(x[0])) 

jedoch erfolgreich, ich kann nicht einen Weg finden, um es danach von Monat zu sortieren, während der Jahre, in aufsteigender Reihenfolge zu halten.

+1

Versuchen Sie, ein Tupel –

+0

@jonrsharpe vorbei: Ohne den 'int', 10 vor 9 für die Monate kommen würde. – fuglede

+0

@fuglede guter Punkt, aber dann * nur * die Monate müssen konvertiert werden, der aktuelle Code des OP hat keinen Vorteil. – jonrsharpe

Antwort

5

Pass ein Tupel:

sorted(dateList, key = lambda x: (int(x[0]),int(x[1]))) 

Aber das sieht besser aus:

sorted(dateList, key = lambda x: tuple(map(int,x))) 

Und eine weitere Alternative könnte zu verwenden sein:

import datetime 
sorted(dateList, key = lambda x: datetime.datetime.strptime(''.join(x),'%Y%m')) 
+1

Danke, ich habe die erste verwendet, weil sie mehr mit meinem Code übereinstimmt und mehr pythisch zu sein scheint. –

+0

Gern geschehen. Der zweite ist mehr Python. –

3

Es scheint, wie Sie in der Notwendigkeit sind einer natürlichen Sortierung Ihrer Daten. Sie können das natsort Paket verwenden, dies zu tun, ohne einen Schlüssel überhaupt passieren zu müssen -

import natsort 

natsort.natsorted(dateList) 

[['2014', '3'], 
['2014', '4'], 
['2014', '8'], 
['2014', '9'], 
['2014', '10'], 
['2015', '2'], 
['2015', '6'], 
['2015', '11'], 
['2016', '2'], 
['2016', '3'], 
['2016', '6'], 
['2017', '3'], 
['2017', '6'], 
['2017', '9'], 
['2017', '10']]