如何在python中对带有月份和年份的strigns列表进行排序

fruv7luv  于 2021-07-14  发布在  Java
关注(0)|答案(2)|浏览(282)

我有以下清单:

dates = ['august_2020.xlsb',
 'april_2020.xlsb',
 'december_2020_part1.xlsb',
 'january_2021.xlsb',
 'february_2021.xlsb',
 'may_2020.xlsb',
 'september_2020_part2.xlsb',
 'november_2020_part2.xlsb',
 'june_2020.xlsb',
 'july_2020.xlsb',
 'january_2020.xlsb',
 'december_2020_part2.xlsb',
 'november_2020_part1.xlsb',
 'october_2020_part2.xlsb',
 'february_2020.xlsb',
 'march_2020.xlsb',
 'october_2020_part1.xlsb',
 'september_2020_part1.xlsb']

我要做的是按月份和年份对这些字符串进行排序,例如我的最终列表应该如下所示:

dates = ['january_2020.xlsb',
 'february_2020.xlsb',
 'march_2020.xlsb',
 'april_2020.xlsb',
 'may_2020.xlsb',
 'june_2020.xlsb',
 'july_2020.xlsb',
 'august_2020.xlsb',
 'september_2020_part1.xlsb',
 'september_2020_part2.xlsb',
 'october_2020_part1.xlsb',
 'october_2020_part2.xlsb',
 'november_2020_part1.xlsb',
 'november_2020_part2.xlsb',
 'december_2020_part1.xlsb',
 'december_2020_part2.xlsb',
 'january_2021.xlsb',
 'february_2021.xlsb'
]

我试过使用: dates.sort() 但我得到的是:

dates = ['april_2020.xlsb',
 'august_2020.xlsb',
 'december_2020_part1.xlsb',
 'december_2020_part2.xlsb',
 'february_2020.xlsb',
 'february_2021.xlsb',
 'january_2020.xlsb',
 'january_2021.xlsb',
 'july_2020.xlsb',
 'june_2020.xlsb',
 'march_2020.xlsb',
 'may_2020.xlsb',
 'november_2020_part1.xlsb',
 'november_2020_part2.xlsb',
 'october_2020_part1.xlsb',
 'october_2020_part2.xlsb',
 'september_2020_part1.xlsb',
 'september_2020_part2.xlsb']

我也尝试过使用以下代码:

from calendar import month_name
month_lookup = [x.lower() for x in list(month_name)]
sorted(dates, key = month_lookup.index)

但是我得到了这个错误: ''april_2020.xlsb' is not in list 我的解决方案似乎都不管用。如果有人知道如何得到所需的产出,我将非常感谢你的帮助。

arknldoa

arknldoa1#

排序使用 date 系统,您可以转换为 datetime 物体。
两者都匹配 december_2020_part2.xlsb 以及 february_2020.xlsb 您需要同时拆分点和下划线,然后将前两部分转换为 datetime 您可以返回datetime和文件名(以元组的形式),因此当日期相同时,它使用文件名(包含 part1 或者 part2 )就这样吧

def filename_sorter(filename: str):
    parts = re.split("[._]", filename)
    return datetime.strptime(" ".join(parts[:2]), "%B %Y"), filename

dates = sorted(dates, key=filename_sorter)

也可以通过返回一个包含3个值的元组来完成:year、month和filename

def filename_sorter(filename: str):
    month, year, *rest = re.split("[._]", filename)
    return int(year), datetime.strptime(month, "%B"), filename
w8biq8rn

w8biq8rn2#

这里有一个解决方案 calendar 您使用了:

import re
from calendar import month_name

month_names = list(month_name)

def month_year_sorter(entry):
    month, year = re.search(r"^(.+?)_(\d{4})", entry).groups()
    return int(year), month_names.index(month.capitalize()), entry

sorted(dates, key=month_year_sorter)

我们通过正则表达式提取月份和年份,然后优先排序年第一,月第二(大写的第一个字母,然后查找),最后回落到字典顺序,返回3元组。

相关问题