python案例统计任意球直接得分几次?

wen python案例 1

本文目录导读:

python案例统计任意球直接得分几次?

  1. 方案1:基于事件日志的简单统计
  2. 方案2:更完整的足球比赛统计系统
  3. 方案3:最简版本(适合快速使用)
  4. 输出示例

我来帮你创建一个统计任意球直接得分的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的类设计更灵活,可以方便地扩展功能或对接真实数据源。

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