简体   繁体   中英

Sorting list that includes dates as strings

I have a following list

data = ['Sep 14, 2020', 'Sep 10, 2020', 'Sep 6, 2020', 'Aug 28, 2020', 
    'Aug 25, 2020', 'Aug 31, 2020', 'Aug 30, 2020', 'Aug 17, 2020', 
     'Nov 12, 2020', 'Dec 3, 2020', 'Dec 17, 2020', 'Dec 28, 2020', 'Dec 31, 2020']

I've tried looping and matching if date in element set that element behind another one but I cannot get it working

I want to sort list from first month Jan to last month Dec but I don't even know where to start

The elements in data are strings, therefore if you run sort on the list, it will be sorted alphabetically.

You can tell the sort function to sort them considering they are dates. To do this, you need to convert them using datetime.strptime like this datetime.strptime(element, '%b %d, %Y') (read more about about strptime here )

So your sort function becomes:

data = ['Sep 14, 2020', 'Sep 10, 2020', 'Sep 6, 2020', 'Aug 28, 2020', 'Aug 25, 2020', 'Aug 31, 2020', 'Aug 30, 2020', 'Aug 17, 2020', 'Nov 12, 2020', 'Dec 3, 2020', 'Dec 17, 2020', 'Dec 28, 2020', 'Dec 31, 2020']

data.sort(key=lambda date: datetime.strptime(date, '%b %d, %Y'))
print(data)

Outputs:

['Aug 17, 2020', 'Aug 25, 2020', 'Aug 28, 2020', 'Aug 30, 2020', 'Aug 31, 2020', 'Sep 6, 2020', 'Sep 10, 2020', 'Sep 14, 2020', 'Nov 12, 2020', 'Dec 3, 2020', 'Dec 17, 2020', 'Dec 28, 2020', 'Dec 31, 2020']

You can convert your strings into datetime objects and then sort them:

from datetime import datetime

data = ['Sep 14, 2020', 'Sep 10, 2020', 'Sep 6, 2020', 'Aug 28, 2020', 'Aug 25, 2020', 'Aug 31, 2020', 'Aug 30, 2020', 'Aug 17, 2020', 'Nov 12, 2020', 'Dec 3, 2020', 'Dec 17, 2020', 'Dec 28, 2020', 'Dec 31, 2020']

dates = list(map(lambda time_str: datetime.strptime(time_str, "%b %d, %Y"), data))
dates.sort()

print(dates)

# or if you want them as strings
print(list(map(lambda x: x.strftime("%b %d, %Y"), dates)))

What you had:

data = ['Sep 14, 2020', 'Sep 10, 2020', 'Sep 6, 2020', 'Aug 28, 2020', 'Aug 25, 2020',
        'Aug 31, 2020', 'Aug 30, 2020', 'Aug 17, 2020', 'Nov 12, 2020', 'Dec 3, 2020',
        'Dec 17, 2020', 'Dec 28, 2020', 'Dec 31, 2020']

What you need to add:

import datetime

r = lambda x: datetime.datetime.strptime(x, '%b %d, %Y')

data.sort(key=r)

Result:

['Aug 17, 2020',
 'Aug 25, 2020',
 'Aug 28, 2020',
 'Aug 30, 2020',
 'Aug 31, 2020',
 'Sep 6, 2020',
 'Sep 10, 2020',
 'Sep 14, 2020',
 'Nov 12, 2020',
 'Dec 3, 2020',
 'Dec 17, 2020',
 'Dec 28, 2020',
 'Dec 31, 2020']

You can pass a key argument to the sort method which will tell Python how to sort the items. For example, suppose I wanted to sort a list of strings based on the alphabetical order of their last letters.

words = ['alfa', 'bravo', 'charlie']
words.sort(key=lambda x: x[-1])
print(words)

Output:

['alfa', 'charlie', 'bravo']

So, you would need to write a function to pass as the key to tell when one date string is "less than" another. This would work:

months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

data=sort(key=lambda x: months.index(x.split()[0])*100 + int(x.split()[1]))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM