基于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
相关产品推荐
相关产品推荐

