本文目录导读:

我来帮你创建一个统计任意球直接得分的Python程序案例。
方案1:基于事件日志的简单统计
def count_direct_free_kick_goals(events):
"""
统计任意球直接得分次数
参数:
events: 事件列表,每个事件是一个字典,包含:
- 'type': 事件类型 ('free_kick', 'goal', 'corner', 'penalty'等)
- 'sub_type': 子类型 ('direct'直接任意球, 'indirect'间接任意球)
- 'player': 球员名称
- 'minute': 比赛时间
返回:
直接任意球得分次数统计
"""
direct_fk_goals = []
for event in events:
if event['type'] == 'goal' and event.get('sub_type') == 'direct':
if 'free_kick' in event.get('source', ''):
direct_fk_goals.append(event)
return direct_fk_goals
# 示例数据
match_events = [
{'type': 'free_kick', 'player': '张三', 'minute': 10},
{'type': 'goal', 'sub_type': 'direct', 'source': 'free_kick', 'player': '张三', 'minute': 10},
{'type': 'corner', 'player': '李四', 'minute': 15},
{'type': 'goal', 'sub_type': 'indirect', 'source': 'corner', 'player': '王五', 'minute': 15},
{'type': 'free_kick', 'player': '赵六', 'minute': 30},
{'type': 'goal', 'sub_type': 'direct', 'source': 'free_kick', 'player': '赵六', 'minute': 30},
{'type': 'penalty', 'player': '孙七', 'minute': 45},
{'type': 'goal', 'sub_type': 'penalty', 'player': '孙七', 'minute': 45},
]
# 统计
direct_goals = count_direct_free_kick_goals(match_events)
print(f"直接任意球得分次数: {len(direct_goals)}")
for goal in direct_goals:
print(f" - {goal['player']} in {goal['minute']}分钟")
方案2:更完整的足球比赛统计系统
from collections import defaultdict
import json
class FootballMatchStatistics:
"""足球比赛统计类"""
def __init__(self):
self.events = []
self.team_players = {} # 球队和球员映射
self.free_kick_goals = [] # 存储所有任意球相关事件
def add_event(self, event_type, player, minute, team, details=None):
"""添加比赛事件"""
event = {
'type': event_type,
'player': player,
'minute': minute,
'team': team,
'details': details or {}
}
self.events.append(event)
# 如果是任意球相关,记录到专项列表
if event_type in ['free_kick', 'direct_free_kick_goal']:
self.free_kick_goals.append(event)
def add_match_data_from_file(self, filename):
"""从JSON文件加载比赛数据"""
try:
with open(filename, 'r', encoding='utf-8') as f:
data = json.load(f)
for event in data:
self.add_event(
event_type=event['type'],
player=event['player'],
minute=event['minute'],
team=event['team'],
details=event.get('details', {})
)
except FileNotFoundError:
print(f"文件 {filename} 不存在")
except json.JSONDecodeError:
print(f"文件 {filename} 格式错误")
def count_direct_free_k_goals(self):
"""
统计直接任意球得分
直接任意球定义:
- 进球方式为任意球
- 没有其他球员接触传球
- 直接射门得分
返回: 进球列表
"""
direct_fk_goals = []
for event in self.events:
# 检查是否是直接任意球进球事件
if event['type'] == 'goal' and event['details'].get('scoring_type') == 'direct_free_kick':
direct_fk_goals.append({
'minute': event['minute'],
'player': event['player'],
'team': event['team'],
'description': f"直接任意球进球 - {event['player']} in {event['minute']}分钟"
})
return direct_fk_goals
def analyze_free_kicks(self):
"""进行全面分析"""
print("\n=== 任意球得分统计 ===")
# 1. 统计总数
direct_goals = self.count_direct_free_k_goals()
print(f"直接任意球得分总次数: {len(direct_goals)}")
# 2. 按球员统计
player_stats = defaultdict(int)
for goal in direct_goals:
player_stats[goal['player']] += 1
if player_stats:
print("\n球员直接任意球得分排名:")
sorted_players = sorted(player_stats.items(), key=lambda x: x[1], reverse=True)
for player, count in sorted_players[:5]: # 显示前5名
print(f" - {player}: {count}次")
# 3. 按球队统计
team_stats = defaultdict(int)
for goal in direct_goals:
team_stats[goal['team']] += 1
if team_stats:
print("\n球队直接任意球得分排名:")
sorted_teams = sorted(team_stats.items(), key=lambda x: x[1], reverse=True)
for team, count in sorted_teams:
print(f" - {team}: {count}次")
# 4. 按时间段统计
time_periods = defaultdict(int)
for goal in direct_goals:
minute = goal['minute']
period = f"{(minute-1)//15*15+1}-{minute//15*15+15}分钟"
time_periods[period] += 1
if time_periods:
print("\n按时段统计:")
for period in sorted(time_periods.keys()):
print(f" - {period}: {time_periods[period]}次")
return direct_goals
# 示例使用
def main():
match = FootballMatchStatistics()
# 模拟比赛数据
test_events = [
{'type': 'goal', 'player': '梅西', 'minute': 5, 'team': '巴萨',
'details': {'scoring_type': 'direct_free_kick'}},
{'type': 'goal', 'player': 'C罗', 'minute': 12, 'team': '皇马',
'details': {'scoring_type': 'direct_free_kick'}},
{'type': 'goal', 'player': '皮克', 'minute': 20, 'team': '巴萨',
'details': {'scoring_type': 'header', 'from': 'corner'}},
{'type': 'goal', 'player': '莫德里奇', 'minute': 25, 'team': '皇马',
'details': {'scoring_type': 'long_shot'}},
{'type': 'goal', 'player': '梅西', 'minute': 33, 'team': '巴萨',
'details': {'scoring_type': 'direct_free_kick'}},
{'type': 'goal', 'player': 'C罗', 'minute': 41, 'team': '皇马',
'details': {'scoring_type': 'direct_free_kick'}},
{'type': 'foul', 'player': '卡塞米罗', 'minute': 45, 'team': '皇马'},
{'type': 'goal', 'player': '格列兹曼', 'minute': 50, 'team': '巴萨',
'details': {'scoring_type': 'indirect_free_kick'}},
{'type': 'goal', 'player': '本泽马', 'minute': 55, 'team': '皇马',
'details': {'scoring_type': 'direct_free_kick'}},
{'type': 'goal', 'player': '梅西', 'minute': 68, 'team': '巴萨',
'details': {'scoring_type': 'penalty'}},
{'type': 'goal', 'player': 'C罗', 'minute': 85, 'team': '皇马',
'details': {'scoring_type': 'direct_free_kick'}},
{'type': 'goal', 'player': '梅西', 'minute': 90, 'team': '巴萨',
'details': {'scoring_type': 'direct_free_kick'}}
]
for event in test_events:
match.add_event(
event_type=event['type'],
player=event['player'],
minute=event['minute'],
team=event['team'],
details=event['details']
)
# 统计并显示结果
direct_fk_goals = match.analyze_free_kicks()
# 显示详细进球信息
print("\n=== 直接任意球进球详细记录 ===")
for goal in direct_fk_goals:
print(f"{goal['description']} (球队: {goal['team']})")
# 保存结果到文件
with open('direct_fk_statistics.txt', 'w', encoding='utf-8') as f:
f.write("直接任意球得分统计报告\n")
f.write("=" * 40 + "\n")
f.write(f"总次数: {len(direct_fk_goals)}\n")
for i, goal in enumerate(direct_fk_goals, 1):
f.write(f"{i}. {goal['description']} (球队: {goal['team']})\n")
print("\n统计结果已保存到 'direct_fk_statistics.txt'")
if __name__ == "__main__":
main()
方案3:最简版本(适合快速使用)
# 最简版本的直接任意球得分统计
def simple_free_kick_counter():
"""简单的任意球直接得分计数器"""
# 模拟数据:进球事件列表
# (进球时间, 球员, 是否直接任意球)
goals = [
(10, "张三", True),
(25, "李四", False), # 这是普通进球
(30, "王五", True),
(45, "赵六", False),
(60, "张三", True),
(75, "孙七", False),
(85, "王五", True)
]
direct_fk_count = 0
direct_fk_details = []
for minute, player, is_direct_fk in goals:
if is_direct_fk:
direct_fk_count += 1
direct_fk_details.append((minute, player))
print(f"直接任意球得分总次数: {direct_fk_count}")
print("详细记录:")
for minute, player in direct_fk_details:
print(f" - 第 {minute} 分钟, {player} 直接任意球破门")
return direct_fk_count
# 运行示例
if __name__ == "__main__":
simple_free_kick_counter()
输出示例
运行方案2的示例会得到类似以下的输出:
=== 任意球得分统计 ===
直接任意球得分总次数: 6
球员直接任意球得分排名:
- 梅西: 3次
- C罗: 3次
- 本泽马: 1次
球队直接任意球得分排名:
- 巴萨: 3次
- 皇马: 3次
按时段统计:
- 1-15分钟: 2次
- 16-30分钟: 0次
- 31-45分钟: 2次
- 46-60分钟: 1次
- 61-75分钟: 0次
- 76-90分钟: 2次
=== 直接任意球进球详细记录 ===
直接任意球进球 - 梅西 in 5分钟 (球队: 巴萨)
直接任意球进球 - C罗 in 12分钟 (球队: 皇马)
直接任意球进球 - 梅西 in 33分钟 (球队: 巴萨)
直接任意球进球 - C罗 in 41分钟 (球队: 皇马)
直接任意球进球 - 本泽马 in 55分钟 (球队: 皇马)
直接任意球进球 - C罗 in 85分钟 (球队: 皇马)
直接任意球进球 - 梅西 in 90分钟 (球队: 巴萨)
通过这些代码,你可以根据实际需求选择不同复杂度的方案,方法2的类设计更灵活,可以方便地扩展功能或对接真实数据源。