Python根据d排序数组

2024-04-25 10:00:13 发布

您现在位置:Python中文网/ 问答频道 /正文

如何根据与字符串组合的最大日期对python列表进行排序

['', 'q//Attachments/Swoop_coverletter_311386_20120103.doc', 'q//Attachments/Swoop_RESUME_311386_20091012.doc', 'q//Attachments/Swoop_Resume_311386_20100901.doc', 'q//Attachments/Swoop_reSume_311386_20120103.doc', 'q//Attachments/Swoop_coverletter_311386_20100901.doc', 'q//Attachments/Swoop_coverletter_311386_20091012.doc']

以上是列表,预期结果如下

['q//Attachments/Swoop_coverletter_311386_20120103.doc','q//Attachments/Swoop_reSume_311386_20120103.doc','q//Attachments/Swoop_Resume_311386_20100901.doc','q//Attachments/Swoop_coverletter_311386_20100901.doc','q//Attachments/Swoop_RESUME_311386_20091012.doc','q//Attachments/Swoop_coverletter_311386_20091012.doc','']

我写了一个脚本,它不是排序,而是在最后只初始化一个值

a = ['q//Attachments/Swoop_coverletter_311386_20120103.doc','q//Attachments/Swoop_reSume_311386_20120103.doc','q//Attachments/Swoop_Resume_311386_20100901.doc','q//Attachments/Swoop_coverletter_311386_20100901.doc','q//Attachments/Swoop_RESUME_311386_20091012.doc','q//Attachments/Swoop_coverletter_311386_20091012.doc','']
print max(a)

结果:

q//Attachments/Swoop_reSume_311386_20120103.doc

我怎样才能得到这样的预期输出

预期产量:

['q//Attachments/Swoop_coverletter_311386_20120103.doc','q//Attachments/Swoop_reSume_311386_20120103.doc','q//Attachments/Swoop_Resume_311386_20100901.doc','q//Attachments/Swoop_coverletter_311386_20100901.doc','q//Attachments/Swoop_RESUME_311386_20091012.doc','q//Attachments/Swoop_coverletter_311386_20091012.doc','']

Tags: 字符串脚本列表doc排序maxattachmentsresume
3条回答

您可以尝试另一种单线解决方案(有点)。您必须首先通过删除空元素来清理列表

given_list = filter(None, given_list)
sorted(given_list, key=lambda x: datetime.strptime(x.split(".")[0][-8:], "%Y%m%d"), reverse=True)

或者像在BioGeek's answer中那样简化它,而不是使用datetime,只需转换成int并对其排序

given_list = filter(None, given_list)
sorted(a, key=lambda x: int(x.split(".")[0][-8:]), reverse=True)

输出:

['q//Attachments/Swoop_coverletter_311386_20120103.doc', 
 'q//Attachments/Swoop_reSume_311386_20120103.doc',
 'q//Attachments/Swoop_Resume_311386_20100901.doc',
 'q//Attachments/Swoop_coverletter_311386_20100901.doc', 
 'q//Attachments/Swoop_RESUME_311386_20091012.doc',
 'q//Attachments/Swoop_coverletter_311386_20091012.doc']

编写一个函数,用正则表达式从字符串中提取日期,并将其用作sorted的键:

import re

l = ['',
     'q//Attachments/Swoop_coverletter_311386_20120103.doc',
     'q//Attachments/Swoop_RESUME_311386_20091012.doc',
     'q//Attachments/Swoop_Resume_311386_20100901.doc',
     'q//Attachments/Swoop_reSume_311386_20120103.doc',
     'q//Attachments/Swoop_coverletter_311386_20100901.doc',
     'q//Attachments/Swoop_coverletter_311386_20091012.doc']

def get_date(line):
    pattern = '.*_(\d{8}).doc'
    m = re.match(pattern, line)
    if m:
        return int(m.group(1))
    else:
        return -1 # or do something else with lines that contain no date


print sorted(l, key=get_date, reverse=True)

印刷品:

['q//Attachments/Swoop_coverletter_311386_20120103.doc', 
 'q//Attachments/Swoop_reSume_311386_20120103.doc', 
 'q//Attachments/Swoop_Resume_311386_20100901.doc', 
 'q//Attachments/Swoop_coverletter_311386_20100901.doc', 
 'q//Attachments/Swoop_RESUME_311386_20091012.doc', 
 'q//Attachments/Swoop_coverletter_311386_20091012.doc', 
 '']

我认为使用内置函数str.rpartition('_')https://docs.python.org/3/library/stdtypes.html#str.rpartition)可以更容易地解决这个问题

当然,我假设所有文件的格式都相同,在这种情况下,上面的函数总是返回<date>.doc。然后您只需删除.doc

相关问题 更多 >