You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于OOP与random库实现足球运动员无重叠分队求助

问题根源

为啥会出现分队重叠?因为你创建了A和B两个Footbalist实例,它们各自调用get_team()时,都是独立从原始名单里随机抽11个人,完全没有关联,重复是必然的。另外原代码的Person类设计也不合理,nameList属性没发挥作用,不符合面向对象里“每个Person对应一个具体个体”的逻辑。

修正后的代码(符合OOP设计)
import random

# 基础Person类:代表单个人员,存储姓名
class Person:
    def __init__(self, name):
        self.name = name

# 继承自Person的Footballist类:代表足球运动员,增加队伍属性
class Footballist(Person):
    def __init__(self, name):
        super().__init__(name)
        self.team = None  # 初始未分配队伍

    def assign_team(self, team_name):
        self.team = team_name

# 1. 生成所有足球运动员实例
player_names = ['Hossien','Maziyar','Akbar','Nima','Mahdi','Farhad','Mohammad','Khashayar','Milad','Mostafa','Amin','Saeeid','Poya','Poriya','Reza','Ali','Behzad','Sohiel','Behrooz','Shahrooz','Saman','Mohsen']
football_players = [Footballist(name) for name in player_names]

# 2. 随机无重叠分队
random.shuffle(football_players)  # 先打乱顺序
team_a = football_players[:11]
team_b = football_players[11:]

# 给球员分配队伍
for player in team_a:
    player.assign_team('A')
for player in team_b:
    player.assign_team('B')

# 打印结果
print("Team A:")
for p in team_a:
    print(f"- {p.name}")

print("\nTeam B:")
for p in team_b:
    print(f"- {p.name}")
关键改进
  • 类设计更合理:Person对应单个个体,存储姓名;Footballist继承后增加队伍属性,符合面向对象的封装思想。
  • 分队逻辑一次性完成:先创建所有球员实例,打乱后拆分,确保人员不重复,解决了原代码各自生成队伍的问题。
  • 职责清晰:球员只管自己的姓名和队伍,分队逻辑统一处理,代码结构更清楚。
贴近你原思路的简化版

要是想尽量贴近你最初的代码结构,也可以只创建一个实例来管理两队,避免重复生成:

import random

player_list = ['Hossien','Maziyar','Akbar','Nima','Mahdi','Farhad','Mohammad','Khashayar','Milad','Mostafa','Amin','Saeeid','Poya','Poriya','Reza','Ali','Behzad','Sohiel','Behrooz','Shahrooz','Saman','Mohsen']

class Person:
    def __init__(self):
        self.name_list = []

class Footballist(Person):
    def __init__(self):
        super().__init__()
        self.team_a = []
        self.team_b = []

    def split_teams(self):
        # 抽11人到A队,剩下的自动进B队
        self.team_a = random.sample(player_list, 11)
        self.team_b = [name for name in player_list if name not in self.team_a]

    def print_team_a(self):
        print("Team A:", self.team_a)
    
    def print_team_b(self):
        print("Team B:", self.team_b)

# 只用一个实例处理分队
team_manager = Footballist()
team_manager.split_teams()
team_manager.print_team_a()
team_manager.print_team_b()

这种方式的核心就是只靠一个实例完成分队,不会出现两个实例各自抽人导致的重叠问题。

内容的提问来源于stack exchange,提问作者Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 05:54:39