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 中按组判断是否存在某条件的高效写法 |
⚠️ 注意事项
-
补时问题:实际比赛上半场包含补时(如 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视为上半场(不计补时)。 -
乌龙球 / 点球:如果需要按"哪队进球"区分,需要额外字段。
-
数据为空:
any([])返回False,符合"无进球"逻辑。
如果你有具体的比赛数据结构,可以发给我,我帮你写出对应的判断代码。