Python实现同赛事同日比赛时差达标统计与结果排序
赛事比赛日时间差统计与分析解决方案
需求说明
- 对结果按赛事、比赛日排序
- 统计每个赛事单日中,时差≥90分钟的比赛对数与总比赛对数的比值(格式:达标数/总数)
- 若单日所有比赛两两间时差均≥90分钟,输出该赛事及比赛日信息;否则输出"False"
原始数据与代码
data.json
[ { "Day": "Giornata 29", "Matches": { "Home": "Egnatia", "Away": "Kukesi", "Times": "19.03. 15:00", "Championship": "CALCIO\nALBANIA Super League\n2023/2024" } }, { "Day": "Giornata 29", "Matches": { "Home": "Egnatia", "Away": "Kukesi", "Times": "20.03. 16:09", "Championship": "CALCIO\nALBANIA Super League\n2023/2024" } }, { "Day": "Giornata 41", "Matches": { "Home": "Lincoln", "Away": "Leyton Orient", "Times": "19.03. 16:00", "Championship": "CALCIO\nINGHILTERRA League One\n2023/2024" } }, { "Day": "Giornata 30", "Matches": { "Home": "Napoli", "Away": "Atalanta", "Times": "30.03. 12:30", "Championship": "CALCIO\nITALIA Serie A\n2023/2024" } } ]
原代码(code.py)
from datetime import datetime, date, timedelta import json with open('data.json', 'r+') as f: fileData = json.load(f) i = 1 minutes = 90 limits = timedelta(minutes=minutes) try: for x in range(len(fileData)): if fileData[i]['Day'] == fileData[x]['Day'] and fileData[i]['Matches']['Championship'] == fileData[x]['Matches']['Championship']: calculate = datetime.strptime(fileData[i]['Matches']['Times'], '%d.%m. %H:%M') - datetime.strptime(fileData[x]['Matches']['Times'], '%d.%m. %H:%M') calculator = timedelta(seconds=calculate.seconds) #print(calculator) if calculator > limits: print(f''' {fileData[x]["Matches"]["Championship"]} {fileData[x]["Day"]} {fileData[x]["Matches"]["Home"]} - {fileData[x]["Matches"]["Away"]} {calculate} {fileData[i]["Matches"]["Home"]} - {fileData[i]["Matches"]["Away"]} ''') i += 1 else: i += 1 #i += 1 except: pass
优化后的代码
from datetime import datetime, timedelta import json from collections import defaultdict # 读取数据 with open('data.json', 'r') as f: file_data = json.load(f) # 按(赛事, 比赛日)分组,存储每个比赛的时间和信息 grouped_matches = defaultdict(list) for item in file_data: championship = item['Matches']['Championship'] day = item['Day'] # 转换时间为datetime对象,方便计算 match_time = datetime.strptime(item['Matches']['Times'], '%d.%m. %H:%M') # 保存比赛信息和时间 grouped_matches[(championship, day)].append({ 'time': match_time, 'info': f"{item['Matches']['Home']} - {item['Matches']['Away']}" }) # 对分组结果按赛事、比赛日排序 sorted_groups = sorted(grouped_matches.items(), key=lambda x: (x[0][0], x[0][1])) # 遍历处理每个分组 current_championship = None for (championship, day), matches in sorted_groups: # 输出赛事名称(仅当赛事变化时) if championship != current_championship: print(f'"{championship}"') current_championship = championship n = len(matches) total_pairs = n * (n - 1) // 2 # 总比赛对数(组合数) valid_pairs = 0 # 统计达标对数(避免重复计算,只算i<j的组合) for i in range(n): for j in range(i + 1, n): time_diff = abs(matches[i]['time'] - matches[j]['time']) if time_diff >= timedelta(minutes=90): valid_pairs += 1 # 输出比值 ratio = f"{valid_pairs}/{total_pairs}" if total_pairs > 0 else "0/0" print(f'"{day}" {ratio}') # 判断是否所有两两时差都达标 if total_pairs > 0 and valid_pairs == total_pairs: print(f'达标:{championship} {day}') else: print('False') print('---')
代码关键部分解释
数据分组:使用
defaultdict(list),以(赛事名称, 比赛日)作为键,将同一赛事同一比赛日的比赛归为一组。如果不用defaultdict,也可以用普通字典配合setdefault实现:grouped_matches = {} for item in file_data: key = (item['Matches']['Championship'], item['Day']) grouped_matches.setdefault(key, []).append(...)defaultdict会自动为不存在的键创建空列表,比setdefault更简洁。总比赛对数计算:n场比赛的两两组合数用公式
n*(n-1)//2,确保每两个比赛只算一次,避免重复统计。达标对数统计:通过双重循环,外层索引i从0到n-2,内层索引j从i+1到n-1,只计算i<j的组合,保证每对比赛只被统计一次。计算时间差的绝对值后,判断是否≥90分钟。
排序:使用
sorted()函数,按赛事名称和比赛日对分组结果排序,保证输出有序。结果输出:按要求输出赛事名称、每个比赛日的比值,以及是否所有两两时差都达标。当比赛数为1时,总对数为0,比值显示为0/0,同时输出False(因为没有两两组合)。
内容的提问来源于stack exchange,提问作者x__SHARINGAN____x
相关产品推荐
相关产品推荐

