python案例认为上半场是否有进球产生?

wen python案例 6

Python案例:判断上半场是否有进球产生

这是一个常见的足球数据分析场景,下面我用几种不同的方式来实现这个判断逻辑。

python案例认为上半场是否有进球产生?

场景说明

给定一场足球比赛的进球记录(含进球时间),判断上半场(前45分钟)是否有进球产生。


基础版(手动记录进球时间)

def has_first_half_goal(goal_minutes):
    """
    判断上半场是否有进球
    :param goal_minutes: 进球时间列表(分钟)
    :return: True/False
    """
    for minute in goal_minutes:
        if minute <= 45:
            return True
    return False
# 测试
match1_goals = [23, 67, 89]     # 上半场有进球
match2_goals = [56, 78, 90]     # 上半场无进球
match3_goals = []               # 没有进球
print(f"比赛1 上半场有进球: {has_first_half_goal(match1_goals)}")
print(f"比赛2 上半场有进球: {has_first_half_goal(match2_goals)}")
print(f"比赛3 上半场有进球: {has_first_half_goal(match3_goals)}")

输出:

比赛1 上半场有进球: True
比赛2 上半场有进球: False
比赛3 上半场有进球: False

使用 Pandas 处理比赛数据

import pandas as pd
# 模拟比赛进球数据
data = {
    'match_id': ['M001', 'M001', 'M002', 'M002', 'M003', 'M004'],
    'team':     ['A',    'B',    'C',    'D',    'E',    'F'],
    'minute':   [23,     67,     12,     78,     90,     5],
    'player':   ['张三', '李四', '王五', '赵六', '孙七', '周八']
}
df = pd.DataFrame(data)
# 标记是否为上半场进球
df['is_first_half'] = df['minute'] <= 45
# 按比赛聚合,判断每场比赛上半场是否有进球
result = df.groupby('match_id')['is_first_half'].any().reset_index()
result.columns = ['match_id', '上半场是否有进球']
print(result)

输出:

  match_id  上半场是否有进球
0     M001        True
1     M002        True
2     M003       False
3     M004        True

面向对象封装(推荐实际项目使用)

class Match:
    def __init__(self, match_id, goals):
        """
        :param match_id: 比赛ID
        :param goals: 进球列表,每个元素为 (分钟, 球员, 队伍)
        """
        self.match_id = match_id
        self.goals = goals
    def has_first_half_goal(self):
        """判断上半场(<=45分钟)是否有进球"""
        return any(g[0] <= 45 for g in self.goals)
    def first_half_goal_count(self):
        """统计上半场进球数"""
        return sum(1 for g in self.goals if g[0] <= 45)
    def report(self):
        status = "有" if self.has_first_half_goal() else "无"
        count = self.first_half_goal_count()
        print(f"[{self.match_id}] 上半场{status}进球产生,共 {count} 个")
# 示例
m1 = Match('M001', [(23, '张三', 'A'), (67, '李四', 'B')])
m2 = Match('M002', [(56, '王五', 'C'), (78, '赵六', 'D')])
m3 = Match('M003', [])
m1.report()
m2.report()
m3.report()

输出:

[M001] 上半场有进球产生,共 1 个
[M002] 上半场无进球产生,共 0 个
[M003] 上半场无进球产生,共 0 个

关键知识点

知识点 说明
判断条件 minute <= 45(含补时可用 <= 45 或区分 minute <= 45)
any() 只要有一个进球在上半场就返回 True,效率高(短路求值)
sum() 统计上半场进球数
groupby().any() Pandas 中按组判断是否存在某条件的高效写法

⚠️ 注意事项

  1. 补时问题:实际比赛上半场包含补时(如 45+2),如果需要精确判断,可以:

    # 若数据用字符串 "45+2" 表示
    def to_minute(s):
        if '+' in s:
            base, extra = s.split('+')
            return int(base) + int(extra)
        return int(s)

    或约定 minute <= 45 视为上半场(不计补时)。

  2. 乌龙球 / 点球:如果需要按"哪队进球"区分,需要额外字段。

  3. 数据为空:any([]) 返回 False,符合"无进球"逻辑。

如果你有具体的比赛数据结构,可以发给我,我帮你写出对应的判断代码。

抱歉,评论功能暂时关闭!