0

I have a situation where I need to get the third latest date, i.e

INPUT :

['14-04-2001', '29-12-2061', '21-10-2019',
 '07-01-1973', '19-07-2014','11-03-1992','21-10-2019']

Also , INPUT

6
14-04-2001
29-12-2061
21-10-2019
07-01-1973
19-07-2014
11-03-1992

OUTPUT : 19-07-2014

import datetime
datelist = ['14-04-2001', '29-12-2061', '21-10-2019', '07-01-1973', '19-07-2014','11-03-1992','21-10-2019' ]
for d in datelist:
    x = datetime.datetime.strptime(d,'%d-%m-%Y')
    print x

How can i achieve this?

styvane
  • 59,869
  • 19
  • 150
  • 156
Kittystone
  • 661
  • 3
  • 9
  • 28

2 Answers2

2

You can sort the list and take the 3rd element from it.

my_list = [datetime.datetime.strptime(d,'%d-%m-%Y') for d in list]
# [datetime.datetime(2001, 4, 14, 0, 0), datetime.datetime(2061, 12, 29, 0, 0), datetime.datetime(2019, 10, 21, 0, 0), datetime.datetime(1973, 1, 7, 0, 0), datetime.datetime(2014, 7, 19, 0, 0), datetime.datetime(1992, 3, 11, 0, 0), datetime.datetime(2019, 10, 21, 0, 0)]
my_list.sort(reverse=True)
my_list[2]
# datetime.datetime(2019, 10, 21, 0, 0)

Also, as per Kerorin's suggestion, if you don't need to sort in-place and just need the 3rd element always, you can simply do

sorted(my_list, reverse=True)[2]

Update

To remove the duplicates, taking inspiration from this answer, you can do the following -

import datetime

datelist = ['14-04-2001', '29-12-2061', '21-10-2019', '07-01-1973', '19-07-2014', '11-03-1992', '21-10-2019']
seen = set()
my_list = [datetime.datetime.strptime(d,'%d-%m-%Y')
           for d in datelist
           if d not in seen and not seen.add(d)]
my_list.sort(reverse=True)
shad0w_wa1k3r
  • 12,955
  • 8
  • 67
  • 90
0

You can use heapq.nlargest to do this.

import heapq
from datetime import datetime


datelist = [
    '14-04-2001',
    '29-12-2061', 
    '21-10-2019',
    '07-01-1973', 
    '19-07-2014', 
    '11-03-1992', 
    '21-10-2019'
]

heapq.nlargest(3, {datetime.strptime(d, "%d-%m-%Y") for d in datelist})[-1]

This return datetime.datetime(2014, 7, 19, 0, 0)

styvane
  • 59,869
  • 19
  • 150
  • 156