You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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('---')

代码关键部分解释

  1. 数据分组:使用defaultdict(list),以(赛事名称, 比赛日)作为键,将同一赛事同一比赛日的比赛归为一组。如果不用defaultdict,也可以用普通字典配合setdefault实现:

    grouped_matches = {}
    for item in file_data:
        key = (item['Matches']['Championship'], item['Day'])
        grouped_matches.setdefault(key, []).append(...)
    

    defaultdict会自动为不存在的键创建空列表,比setdefault更简洁。

  2. 总比赛对数计算:n场比赛的两两组合数用公式n*(n-1)//2,确保每两个比赛只算一次,避免重复统计。

  3. 达标对数统计:通过双重循环,外层索引i从0到n-2,内层索引j从i+1到n-1,只计算i<j的组合,保证每对比赛只被统计一次。计算时间差的绝对值后,判断是否≥90分钟。

  4. 排序:使用sorted()函数,按赛事名称和比赛日对分组结果排序,保证输出有序。

  5. 结果输出:按要求输出赛事名称、每个比赛日的比值,以及是否所有两两时差都达标。当比赛数为1时,总对数为0,比值显示为0/0,同时输出False(因为没有两两组合)。

内容的提问来源于stack exchange,提问作者x__SHARINGAN____x

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:32:34