简体   繁体   English

在 python 中对字符串列表进行数字排序

[英]sort a list of string numerically in python

I know there are many questions regarding this type of sorting, I tried many time by referring to those questions and also by going through the re topic in python too我知道有很多关于这种排序的问题,我通过参考这些问题并通过 python 中的re主题尝试了很多次

My question is:我的问题是:

class Example(models.Model):
    _inherit = 'sorting.example'

    def unable_to_sort(self):
        data_list = ['Abigail Peterson Jan 25','Paul Williams Feb 1','Anita Oliver Jan 24','Ernest Reed Jan 28']
        self.update({'list_of_birthday_week': ','.join(r for r in data_list)})

I need to be sorted according to the month & date like:我需要根据monthdate进行sorted ,例如:

data_list = ['Anita Oliver Jan 24','Abigail Peterson Jan 25','Ernest Reed Jan 28','Paul Williams Feb 1']

is there any way to achieve this?有什么办法可以做到这一点?

Use a regex to extract the date than use it as key of sorted function.使用正则表达式提取日期而不是将其用作已sorted function 的键。

import re

pattern = r'(\b(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\D?(?:\d{1,2}\D?))'

sort_by_date = lambda x: datetime.strptime(re.search(pattern, x).group(0), '%b %d')
out = sorted(data_list, key=sort_by_date)

Output: Output:

>>> out
['Anita Oliver Jan 24',
 'Abigail Peterson Jan 25',
 'Ernest Reed Jan 28',
 'Paul Williams Feb 1']

Input:输入:

>>> data_list
['Abigail Peterson Jan 25',
 'Paul Williams Feb 1',
 'Ernest Reed Jan 28',
 'Anita Oliver Jan 24']

You need to extract the date part from the string, and then turn the date string into a comparable format.您需要从字符串中提取日期部分,然后将日期字符串转换为可比较的格式。 For the first task, regexen would be a decent choice here, and for the second part, datetime.strptime would be appropriate:对于第一个任务,regexen 在这里是一个不错的选择,而对于第二部分, datetime.strptime将是合适的:

>>> import re
>>> from datetime import *
>>> 
>>> re.search('\w+ \d+$', 'Abigail Peterson Jan 25')
<re.Match object; span=(17, 23), match='Jan 25'>
>>> re.search('\w+ \d+$', 'Abigail Peterson Jan 25')[0]
'Jan 25'
>>> 
>>> datetime.strptime('Jan 25', '%b %d')
datetime.datetime(1900, 1, 25, 0, 0)
>>> datetime.strptime(re.search('\w+ \d+$', 'Abigail Peterson Jan 25')[0], '%b %d')
datetime.datetime(1900, 1, 25, 0, 0)

Then turn that into a callback for list.sort :然后将其转换为list.sort的回调:

>>> data_list.sort(key=lambda i: datetime.strptime(re.search('\w+ \d+$', i)[0], '%b %d'))
['Anita Oliver Jan 24', 'Abigail Peterson Jan 25', 'Ernest Reed Jan 28', 'Paul Williams Feb 1']

You can also use split() to accomplish that.您也可以使用split()来完成它。

from datetime import datetime
...
def unable_to_sort(self):
    data_list = ['Abigail Peterson Jan 25','Paul Williams Feb 1','Anita Oliver Jan 24','Ernest Reed Jan 28']
    
    def get_date(data):
        name, str_date = data.split(" ")[:-2], data.split(" ")[-2:]
        month, day = str_date
        return datetime.strptime(f"{month} {day}", "%b %d")
       
    sorted_data_list = sorted(data_list, key=get_date)     
    self.update({'list_of_birthday_week': ','.join(r for r in sorted_data_list)})

You can use sorted function with keys datetime.strptime() and date value.您可以将已排序的 function 与键datetime.strptime()和日期值一起使用。

from datetime import datetime
data_list = ['Anita Oliver Jan 24','Abigail Peterson Jan 25','Ernest Reed Jan 28','Paul Williams Feb 1']
k=[x.split() for x in data_list]
days_sorted = sorted(k, key=lambda x: (datetime.strptime(x[2],'%b'),x[3]))

[['Anita', 'Oliver', 'Jan', '24'],
 ['Abigail', 'Peterson', 'Jan', '25'],
 ['Ernest', 'Reed', 'Jan', '28'],
 ['Paul', 'Williams', 'Feb', '1']]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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