python案例统计关门防守成功几次?

wen python案例 2

Python案例:统计"关门防守"成功几次

"关门防守"通常指格斗/体育比赛中,防守方成功化解对方进攻的次数,下面我用一个格斗比赛数据统计的案例来演示如何用Python统计关门防守成功次数。

python案例统计关门防守成功几次?

场景设定

假设有一场比赛的逐回合事件记录,每次事件包含:回合、时间、动作类型、结果。

# 比赛事件数据(模拟)
events = [
    {"round": 1, "time": "0:30", "action": "takedown_attempt", "result": "defended"},   # 防摔成功
    {"round": 1, "time": "1:10", "action": "strike",           "result": "hit"},
    {"round": 1, "time": "2:45", "action": "takedown_attempt", "result": "defended"},   # 防摔成功
    {"round": 2, "time": "0:20", "action": "submission_attempt","result": "escaped"},    # 逃脱降服
    {"round": 2, "time": "3:00", "action": "takedown_attempt", "result": "taken_down"}, # 被摔倒
    {"round": 3, "time": "1:15", "action": "takedown_attempt", "result": "defended"},   # 防摔成功
    {"round": 3, "time": "2:30", "action": "submission_attempt","result": "escaped"},    # 逃脱降服
]
# 定义哪些算"关门防守成功"
DEFENSE_SUCCESS = {
    "takedown_attempt": "defended",       # 防摔成功
    "submission_attempt": "escaped",      # 逃脱降服
}
def count_successful_defense(events):
    """统计关门防守成功次数,并按回合分组"""
    total = 0
    by_round = {}
    details = []
    for e in events:
        expected = DEFENSE_SUCCESS.get(e["action"])
        if expected and e["result"] == expected:
            total += 1
            by_round[e["round"]] = by_round.get(e["round"], 0) + 1
            details.append(e)
    return total, by_round, details
total, by_round, details = count_successful_defense(events)
print(f"关门防守成功总次数:{total}")
print("各回合成功次数:", by_round)
print("详细记录:")
for d in details:
    print(f"  第{d['round']}回合 {d['time']} - {d['action']} -> {d['result']}")

输出结果

关门防守成功总次数:5
各回合成功次数: {1: 2, 2: 1, 3: 2}
详细记录:
  第1回合 0:30 - takedown_attempt -> defended
  第1回合 2:45 - takedown_attempt -> defended
  第2回合 0:20 - submission_attempt -> escaped
  第3回合 1:15 - takedown_attempt -> defended
  第3回合 2:30 - submission_attempt -> escaped

进阶:用 pandas 处理

如果数据量大,推荐用 pandas:

import pandas as pd
df = pd.DataFrame(events)
# 构造"是否防守成功"标记
df["defense_success"] = df.apply(
    lambda row: DEFENSE_SUCCESS.get(row["action"]) == row["result"], axis=1
)
total = df["defense_success"].sum()
by_round = df[df["defense_success"]].groupby("round").size()
print("总成功次数:", total)
print("各回合:\n", by_round)

关键点说明

  1. 定义规则表 DEFENSE_SUCCESS:把"动作→成功结果"的映射抽出来,方便日后扩展(比如加上 "clinch_defense": "defended")。
  2. 先过滤再计数:避免把"进攻成功"误算。
  3. 分组统计:按回合/时间/对手分组,可以得到更细的分析。
  4. 可扩展:如果把 action 换成你自己的业务字段(防守战术类型"),逻辑完全通用。

如果你说的"关门防守"是足球/篮球里的特定战术(比如足球的"摆大巴"、篮球的"关门"协防),或者有具体的数据字段格式,告诉我,我可以把统计逻辑改成对应的版本。

上一篇python案例预测的比分差距会很大吗?

下一篇当前分类已是最新一篇

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

友情链接攻略窝 · 礼包窝 · 配置窝 · 换算窝 · 算法窝 · 查文窝 · 手册窝 · 问答窝 · 全文搜 · 手册库
相关站点礼包窝 · 查文窝