python案例统计转身过人次数谁多?

wen python案例 5

篮球转身过人次数统计案例

下面是一个完整的 Python 案例,用于统计篮球运动员转身过人次数并排名,判断谁使用转身过人最多。

python案例统计转身过人次数谁多?

场景说明

假设我们有一场比赛的记录数据,每次球员完成"转身过人"动作都会记录一条数据,我们需要统计每位球员的转身过人次数,并找出最多的人。


基础版(使用列表 + 字典)

# 模拟比赛记录:每一条代表一次成功的转身过人
records = [
    "库里", "詹姆斯", "库里", "欧文", "杜兰特",
    "欧文", "库里", "詹姆斯", "欧文", "欧文",
    "杜兰特", "库里", "欧文", "詹姆斯", "库里"
]
# 统计次数
counter = {}
for player in records:
    counter[player] = counter.get(player, 0) + 1
# 按次数从高到低排序
ranking = sorted(counter.items(), key=lambda x: x[1], reverse=True)
print("=== 转身过人次数排行榜 ===")
for i, (name, count) in enumerate(ranking, 1):
    print(f"第{i}名:{name} —— {count} 次")
# 找出最多的人
top_player, top_count = ranking[0]
print(f"\n🏆 转身过人王:{top_player},共 {top_count} 次")

输出示例:

=== 转身过人次数排行榜 ===
第1名:欧文 —— 5 次
第2名:库里 —— 5 次
第3名:詹姆斯 —— 3 次
第4名:杜兰特 —— 2 次
🏆 转身过人王:欧文,共 5 次

进阶版(使用 collections.Counter,更简洁)

from collections import Counter
records = [
    "库里", "詹姆斯", "库里", "欧文", "杜兰特",
    "欧文", "库里", "詹姆斯", "欧文", "欧文",
    "杜兰特", "库里", "欧文", "詹姆斯", "库里"
]
counter = Counter(records)
# 打印所有统计
print("全部统计:", dict(counter))
# 找出最多的(most_common 返回列表,按次数降序)
ranking = counter.most_common()
print("\n=== 排行榜 ===")
for rank, (name, count) in enumerate(ranking, 1):
    print(f"{rank}. {name}: {count} 次")
# 处理并列第一的情况
max_count = ranking[0][1]
winners = [name for name, cnt in ranking if cnt == max_count]
print(f"\n🏆 转身过人最多:{'、'.join(winners)}(各 {max_count} 次)")

真实场景版(带时间、球队、是否成功的结构化数据)

from collections import defaultdict
from datetime import datetime
# 结构化比赛数据:球员、球队、动作、是否成功、时间
events = [
    {"player": "欧文",   "team": "独行侠", "action": "转身过人", "success": True},
    {"player": "库里",   "team": "勇士",   "action": "转身过人", "success": True},
    {"player": "詹姆斯", "team": "湖人",   "action": "转身过人", "success": False},
    {"player": "欧文",   "team": "独行侠", "action": "转身过人", "success": True},
    {"player": "库里",   "team": "勇士",   "action": "转身过人", "success": True},
    {"player": "杜兰特", "team": "太阳",   "action": "转身过人", "success": True},
    {"player": "欧文",   "team": "独行侠", "action": "转身过人", "success": True},
    {"player": "库里",   "team": "勇士",   "action": "转身过人", "success": False},
    {"player": "詹姆斯", "team": "湖人",   "action": "转身过人", "success": True},
    {"player": "欧文",   "team": "独行侠", "action": "转身过人", "success": True},
]
# 统计:只统计成功的转身过人
stats = defaultdict(lambda: {"total": 0, "success": 0, "team": ""})
for e in events:
    if e["action"] != "转身过人":
        continue
    p = e["player"]
    stats[p]["team"] = e["team"]
    stats[p]["total"] += 1
    if e["success"]:
        stats[p]["success"] += 1
# 计算成功率并排序
result = []
for player, info in stats.items():
    rate = info["success"] / info["total"] * 100
    result.append({
        "player": player,
        "team": info["team"],
        "success_count": info["success"],
        "total_count": info["total"],
        "rate": rate
    })
result.sort(key=lambda x: x["success_count"], reverse=True)
print(f"{'排名':<4}{'球员':<8}{'球队':<8}{'成功次数':<8}{'总次数':<8}{'成功率':<8}")
print("-" * 50)
for rank, r in enumerate(result, 1):
    print(f"{rank:<5}{r['player']:<9}{r['team']:<9}"
          f"{r['success_count']:<10}{r['total_count']:<9}{r['rate']:.1f}%")
# 找出最多者(处理并列)
max_cnt = result[0]["success_count"]
winners = [r["player"] for r in result if r["success_count"] == max_cnt]
print(f"\n🏆 转身过人次数最多:{'、'.join(winners)}({max_cnt} 次)")

输出示例:

排名  球员    球队    成功次数 总次数  成功率
--------------------------------------------------
1    欧文    独行侠   4        4      100.0%
2    库里    勇士     2        3      66.7%
3    杜兰特  太阳     1        1      100.0%
4    詹姆斯  湖人     1        2      50.0%
🏆 转身过人次数最多:欧文(4 次)

关键知识点

技术点 用途
dict.get(k, 0) 安全计数(避免 KeyError)
Counter 快速频率统计
defaultdict 分组聚合更优雅
sorted(key=..., reverse=True) 排行榜排序
并列处理 判断 count == max_count

扩展建议

  1. 读取真实数据:用 pandas 从 Excel/CSV 读取比赛数据
    import pandas as pd
    df = pd.read_excel("比赛数据.xlsx")
    df[df["动作"]=="转身过人"]["球员"].value_counts()
  2. 可视化:用 matplotlib 画柱状图对比
  3. 时间维度:统计每节/每场比赛的转身过人分布

如果你有真实的比赛数据格式(CSV 字段说明),告诉我,我可以帮你改成直接适配的代码。

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