簡體   English   中英

在 python 中對字符串列表進行數字排序

[英]sort a list of string numerically in python

我知道有很多關於這種排序的問題,我通過參考這些問題並通過 python 中的re主題嘗試了很多次

我的問題是:

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)})

我需要根據monthdate進行sorted ,例如:

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

有什么辦法可以做到這一點?

使用正則表達式提取日期而不是將其用作已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:

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

輸入:

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

您需要從字符串中提取日期部分,然后將日期字符串轉換為可比較的格式。 對於第一個任務,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)

然后將其轉換為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']

您也可以使用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)})

您可以將已排序的 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