如何正确按日期对含赛事信息的Python列表进行排序?
问题分析与解决方案
你的排序逻辑错误的核心原因是直接对日期字符串进行字典序排序,而非按实际日期的时间顺序排序。字符串'01/10'字典序小于'30/09',所以会排在前面,但实际日期上9月30日早于10月1日。
要实现正确的日期排序,需将字符串形式的日期转换为可按时间顺序比较的类型,比如datetime对象,或提取出月份和日期的整数值组成元组。
方法一:使用datetime模块解析日期
利用datetime.strptime将日期字符串解析为datetime对象,以此作为排序键:
from datetime import datetime a = ['28/09 Fenerbahçe Başakşehir FK : 3.0 Normal', '29/09 Samsunspor Gaziantep FK : 2.25 Normal', '30/09 Sivasspor Hatayspor : 2.33 Normal', '30/09 İstanbulspor Antalyaspor : 2.17 Alt Degerli', '30/09 Trabzonspor Pendikspor : 2.67 Normal', '30/09 Galatasaray MKE Ankaragücü : 3.8 Normal', '01/10 Fatih Karagümrük Kasımpaşa : 1.8 Alt Degerli', '01/10 Fenerbahçe Çaykur Rizespor : 3.8 Normal', '01/10 Adana Demirspor Alanyaspor : 2.8 Normal', '01/10 Konyaspor Beşiktaş : 2.83 Normal', '29/09 Hoffenheim Borussia Dortmund : 3.75 Normal', '30/09 Bochum Mönchengladbach : 4.5 Normal', '30/09 Heidenheim Union Berlin : 4.75 Normal', '30/09 Köln Stuttgart : 4.25 Normal', '30/09 Mainz 05 Bayer Leverkusen : 3.25 Normal', '30/09 Wolfsburg Eintracht Frankfurt : 2.25 Alt Degerli', '30/09 RB Leipzig Bayern Münih : 4.0 Normal', '01/10 Darmstadt 98 Werder Bremen : 4.5 Normal', '01/10 Freiburg Augsburg : 3.5 Normal', '28/09 Frosinone Fiorentina : 4.0 Normal', '28/09 Monza Bologna : 1.5 Normal', '28/09 Genoa Roma : 3.5 UST Degerli', '30/09 Lecce Napoli : 2.33 Normal', '30/09 Milan Lazio : 3.2 UST Degerli', '30/09 Salernitana Inter : 2.0 Alt Degerli', '01/10 Bologna Empoli : 2.8 Normal', '01/10 Udinese Genoa : 1.33 Normal', '01/10 Atalanta Juventus : 3.2 Normal', '01/10 Roma Frosinone : 3.2 Normal', '28/09 Celta Vigo Deportivo Alaves : 1.33 Normal', '28/09 Granada Real Betis : 4.5 UST Degerli', '28/09 Osasuna Atletico Madrid : 2.5 UST Degerli', '29/09 Barcelona Sevilla : 3.8 Normal', '30/09 Getafe Villarreal : 2.17 Normal', '30/09 Rayo Vallecano Mallorca : 3.86 UST Degerli', '30/09 Girona Real Madrid : 3.29 Normal', '30/09 Real Sociedad Athletic Bilbao : 3.29 UST Degerli', '01/10 Almeria Granada : 4.0 Normal', '01/10 Deportivo Alaves Osasuna : 3.33 UST Degerli', '30/09 Aston Villa Brighton & Hove Albion : 4.25 Normal', '30/09 Bournemouth Arsenal : 1.2 Alt Degerli', '30/09 Everton Luton Town : 2.0 Normal', '30/09 Manchester United Crystal Palace : 2.83 Normal', '30/09 Newcastle United Burnley : 3.0 Normal', '30/09 West Ham United Sheffield United : 3.5 Normal', '30/09 Wolverhampton Manchester City : 3.8 Normal', '30/09 Tottenham Liverpool : 2.8 Normal', '01/10 Nottingham Forest Brentford : 2.25 Normal', '02/10 Fulham Chelsea : 2.0 Normal'] def get_date_key(item): # 提取前5位日期字符串,解析为datetime对象 date_str = item[:5] return datetime.strptime(date_str, '%d/%m') sorted_data = sorted(a, key=get_date_key) for item in sorted_data: print(item)
方法二:手动提取月份和日期的整数值
如果不想引入datetime模块,可以拆分日期字符串为日和月的整数,组成(月, 日)的元组作为排序键(先比较月份,再比较日期):
a = ['28/09 Fenerbahçe Başakşehir FK : 3.0 Normal', '29/09 Samsunspor Gaziantep FK : 2.25 Normal', '30/09 Sivasspor Hatayspor : 2.33 Normal', '30/09 İstanbulspor Antalyaspor : 2.17 Alt Degerli', '30/09 Trabzonspor Pendikspor : 2.67 Normal', '30/09 Galatasaray MKE Ankaragücü : 3.8 Normal', '01/10 Fatih Karagümrük Kasımpaşa : 1.8 Alt Degerli', '01/10 Fenerbahçe Çaykur Rizespor : 3.8 Normal', '01/10 Adana Demirspor Alanyaspor : 2.8 Normal', '01/10 Konyaspor Beşiktaş : 2.83 Normal', '29/09 Hoffenheim Borussia Dortmund : 3.75 Normal', '30/09 Bochum Mönchengladbach : 4.5 Normal', '30/09 Heidenheim Union Berlin : 4.75 Normal', '30/09 Köln Stuttgart : 4.25 Normal', '30/09 Mainz 05 Bayer Leverkusen : 3.25 Normal', '30/09 Wolfsburg Eintracht Frankfurt : 2.25 Alt Degerli', '30/09 RB Leipzig Bayern Münih : 4.0 Normal', '01/10 Darmstadt 98 Werder Bremen : 4.5 Normal', '01/10 Freiburg Augsburg : 3.5 Normal', '28/09 Frosinone Fiorentina : 4.0 Normal', '28/09 Monza Bologna : 1.5 Normal', '28/09 Genoa Roma : 3.5 UST Degerli', '30/09 Lecce Napoli : 2.33 Normal', '30/09 Milan Lazio : 3.2 UST Degerli', '30/09 Salernitana Inter : 2.0 Alt Degerli', '01/10 Bologna Empoli : 2.8 Normal', '01/10 Udinese Genoa : 1.33 Normal', '01/10 Atalanta Juventus : 3.2 Normal', '01/10 Roma Frosinone : 3.2 Normal', '28/09 Celta Vigo Deportivo Alaves : 1.33 Normal', '28/09 Granada Real Betis : 4.5 UST Degerli', '28/09 Osasuna Atletico Madrid : 2.5 UST Degerli', '29/09 Barcelona Sevilla : 3.8 Normal', '30/09 Getafe Villarreal : 2.17 Normal', '30/09 Rayo Vallecano Mallorca : 3.86 UST Degerli', '30/09 Girona Real Madrid : 3.29 Normal', '30/09 Real Sociedad Athletic Bilbao : 3.29 UST Degerli', '01/10 Almeria Granada : 4.0 Normal', '01/10 Deportivo Alaves Osasuna : 3.33 UST Degerli', '30/09 Aston Villa Brighton & Hove Albion : 4.25 Normal', '30/09 Bournemouth Arsenal : 1.2 Alt Degerli', '30/09 Everton Luton Town : 2.0 Normal', '30/09 Manchester United Crystal Palace : 2.83 Normal', '30/09 Newcastle United Burnley : 3.0 Normal', '30/09 West Ham United Sheffield United : 3.5 Normal', '30/09 Wolverhampton Manchester City : 3.8 Normal', '30/09 Tottenham Liverpool : 2.8 Normal', '01/10 Nottingham Forest Brentford : 2.25 Normal', '02/10 Fulham Chelsea : 2.0 Normal'] def get_date_key(item): # 拆分日期字符串为日和月,转换为整数,返回(月, 日)元组 day, month = item[:5].split('/') return (int(month), int(day)) sorted_data = sorted(a, key=get_date_key) for item in sorted_data: print(item)
正确排序结果逻辑
两种方法都会得到符合日期顺序的结果:
- 所有9月28日的赛事
- 所有9月29日的赛事
- 所有9月30日的赛事
- 所有10月1日的赛事
- 10月2日的赛事
内容的提问来源于stack exchange,提问作者MECRA YAVCIN
相关产品推荐
相关产品推荐

