6 回答

TA贡献1871条经验 获得超13个赞
这是我利用集合的新数据类的地方。您可以通过frozen=True在装饰器中设置来使数据类可散列。首先,您要将玩家添加到一个集合中以获得独特的玩家。然后你会得到 n 大小球队的所有球员组合。然后你可以创建一组独特的团队。然后创建有效的分组,而没有球员在团队中出现多次。最后,您可以计算整个分组的总团队技能水平的最大差异(再次利用组合),并使用它来对您的有效分组进行排序。所以像这样的事情。
from dataclasses import dataclass
from itertools import combinations
from typing import FrozenSet
import yaml
@dataclass(order=True, frozen=True)
class Player:
name: str
skill: int
@dataclass(order=True, frozen=True)
class Team:
members: FrozenSet[Player]
def total_skill(self):
return sum(p.skill for p in self.members)
def is_valid(grouping):
players = set()
for team in grouping:
for player in team.members:
if player in players:
return False
players.add(player)
return True
def max_team_disparity(grouping):
return max(
abs(t1.total_skill() - t2.total_skill())
for t1, t2 in combinations(grouping, 2)
)
def best_team_matchups(player_file, k, n):
with open(player_file) as f:
players = set(Player(p['name'], p['skill']) for p in yaml.load(f))
player_combs = combinations(players, n)
unique_teams = set(Team(frozenset(team)) for team in player_combs)
valid_groupings = set(g for g in combinations(unique_teams, k) if is_valid(g))
for g in sorted(valid_groupings, key=max_team_disparity):
print(g)
best_team_matchups('test.yaml', k=2, n=4)
示例输出:
(
Team(members=frozenset({
Player(name='Chr', skill=6),
Player(name='Christopher', skill=6),
Player(name='Nicholas', skill=7),
Player(name='Patricia', skill=4)
})),
Team(members=frozenset({
Player(name='Bia', skill=4),
Player(name='Bianca', skill=4),
Player(name='Danny', skill=8),
Player(name='Nicho', skill=7)
}))
)
添加回答
举报