Python案例:判断上半场是否有进球产生
下面通过几个不同层次的案例,展示如何用Python判断一场足球比赛上半场是否有进球。

案例1:基础判断(已知半场比分)
def has_first_half_goal(home_ht, away_ht):
"""
判断上半场是否有进球
:param home_ht: 主队上半场进球数
:param away_ht: 客队上半场进球数
:return: True/False
"""
return (home_ht + away_ht) > 0
# 测试
print(has_first_half_goal(1, 0)) # True 上半场有进球
print(has_first_half_goal(0, 0)) # False 上半场无进球
print(has_first_half_goal(2, 1)) # True
案例2:根据事件时间线判断
假设我们有一场比赛的进球事件列表,每个事件包含时间和进球方。
def has_goal_in_first_half(events, half_end_minute=45):
"""
根据进球事件时间判断上半场是否有进球
:param events: 事件列表 [(分钟, 'home'/'away'), ...]
:param half_end_minute: 上半场结束时间(默认45分钟)
:return: True/False
"""
for minute, team in events:
if minute <= half_end_minute:
return True
return False
# 一场比赛的进球事件
match_events = [
(23, 'home'), # 23分钟主队进球
(67, 'away'), # 67分钟客队进球
(89, 'home'), # 89分钟主队进球
]
print(has_goal_in_first_half(match_events))
# 输出: True —— 因为23分钟有进球
# 若进球都发生在下半场
match_events2 = [
(56, 'home'),
(78, 'away'),
]
print(has_goal_in_first_half(match_events2))
# 输出: False
案例3:结合Pandas处理多场比赛数据
实际数据分析中,通常需要批量处理,假设我们有一个CSV数据(比赛ID、上半场主队进球、上半场客队进球):
import pandas as pd
# 模拟数据
data = {
'match_id': [1, 2, 3, 4, 5],
'home_ht': [1, 0, 2, 0, 0],
'away_ht': [0, 0, 1, 0, 1],
}
df = pd.DataFrame(data)
# 新增一列:上半场是否有进球
df['first_half_goal'] = (df['home_ht'] + df['away_ht']) > 0
print(df)
输出:
match_id home_ht away_ht first_half_goal
0 1 1 0 True
1 2 0 0 False
2 3 2 1 True
3 4 0 0 False
4 5 0 1 True
案例4:完整模拟 - 随机生成比赛数据
import random
def simulate_match():
"""模拟一场比赛,返回上半场比分和是否有进球"""
home_ht = random.choices([0, 1, 2, 3], weights=[50, 30, 15, 5])[0]
away_ht = random.choices([0, 1, 2, 3], weights=[55, 28, 12, 5])[0]
has_goal = (home_ht + away_ht) > 0
return home_ht, away_ht, has_goal
# 模拟10场比赛
for i in range(1, 11):
h, a, g = simulate_match()
status = "有进球 ✅" if g else "无进球 ❌"
print(f"第{i}场 上半场比分 {h}-{a} {status}")
| 场景 | 判断依据 |
|---|---|
| 已知半场比分 | home_ht + away_ht > 0 |
| 已知事件时间线 | 是否存在 minute <= 45 的进球事件 |
| 批量数据分析 | Pandas 列运算 + 布尔判断 |
| 加时/补时处理 | 可把 half_end_minute 设为 45+X |
⚠️ 注意事项
- 伤停补时:上半场补时(如45+2)的进球也属于上半场,需将阈值设为
>= 45 + injury_time。 - 乌龙球:算作对方进球,但仍是"有进球"。
- 取消的进球:数据中若包含VAR取消进球,需先过滤再判断。
如果你有具体的比赛数据格式(如JSON、CSV、API接口),我可以给出针对性的解析代码。