在python中的联盟夹具生成器

Rob*_*rto 3 python fixtures

我想在python中编写一个League Fixture生成器,但我不能.这是详细信息:

有一个动态的团队列表teams = ["Team1", "Team2", "Team3", "Team4"].如何从团队列表中生成fixture_weekx列表?例如:

fixture_week1 = ["Team1", "Team2", "Team3", "Team4"]
fixture_week2 = ["Team1", "Team3", "Team2", "Team4"]
fixture_week2 = ["Team1", "Team4", "Team2", "Team3"]

#Return matches:
fixture_week1 = ["Team2", "Team1", "Team4", "Team3"]
fixture_week2 = ["Team3", "Team1", "Team4", "Team2"]
fixture_week2 = ["Team4", "Team1", "Team3", "Team2"]
Run Code Online (Sandbox Code Playgroud)

任何的想法?

Mar*_*ina 9

夹具调度是众所周知的问题.这是在以下网址给出的算法的python实现:http://en.wikipedia.org/wiki/Round-robin_tournament

# generation code - for cut and paste

import operator
def fixtures(teams):
    if len(teams) % 2:
        teams.append('Day off')  # if team number is odd - use 'day off' as fake team     

    rotation = list(teams)       # copy the list

    fixtures = []
    for i in range(0, len(teams)-1):
        fixtures.append(rotation)
        rotation = [rotation[0]] + [rotation[-1]] + rotation[1:-1]

    return fixtures

# demo code
teams = ["Team1", "Team2", "Team3", "Team4", "Team5"]

# for one match each - use this block only
matches = fixtures(teams)
for f in matches:    
    print zip(*[iter(f)]*2)

# if you want return matches 
reverse_teams =  [list(x) for x in zip(teams[1::2], teams[::2])]
reverse_teams = reduce(operator.add,  reverse_teams)    # swap team1 with team2, and so on ....

#then run the fixtures again
matches = fixtures(reverse_teams)

print "return matches"
for f in matches:    
    print f
Run Code Online (Sandbox Code Playgroud)

这会生成输出:

[('Team1', 'Day off'), ('Team2', 'Team5'), ('Team3', 'Team4')]
[('Team1', 'Team5'), ('Day off', 'Team4'), ('Team2', 'Team3')]
[('Team1', 'Team4'), ('Team5', 'Team3'), ('Day off', 'Team2')]
[('Team1', 'Team3'), ('Team4', 'Team2'), ('Team5', 'Day off')]
[('Team1', 'Team2'), ('Team3', 'Day off'), ('Team4', 'Team5')]
Run Code Online (Sandbox Code Playgroud)

  • 这不能解释.您显示的输出不是实际输出.此外,在实际输出中,第1组休息一天,第2组休息两天,第3组没有休息日,第4组没有休息日,第5组休息两天.在"回归比赛"队伍中,1和4队都没有休息一天,而其他队员则有倍数. (3认同)

jjk*_*jjk 6

我想评论@MariaZverina 的代码不太有效。我按原样尝试了它,但我没有得到正确的配对。我在下面所做的修改适用于她的代码。不同之处在于我通过将固定装置 f 的前半部分与相反的后半部分进行压缩来对每个固定装置进行彩虹式配对。

# demo code
teams = ["Team1", "Team2", "Team3", "Team4", "Team5"]

# for one match each - use this block only
matches = fixtures(teams)    
for f in matches:    
    # This is where the difference is.
    # I implemented "rainbow" style pairing from each fixture f 
    # In other words: 
    # [(f[0],[f[n-1]), (f[1],f[n-2]), ..., (f[n/2-1],f[n/2])], 
    # where n is the length of f
    n = len(f)
    print zip(f[0:n/2],reversed(f[n/2:n]))
Run Code Online (Sandbox Code Playgroud)


小智 5

@MariaZverina 的代码不起作用,我也使用 Round-robin_tournament 实现了此代码:

teams = ["Team1", "Team2", "Team3", "Team4", "Team5", "Team6"]
if len(teams) % 2:
    teams.append('Day off')
n = len(teams)
matchs = []
fixtures = []
return_matchs = []
for fixture in range(1, n):
    for i in range(n/2):
        matchs.append((teams[i], teams[n - 1 - i]))
        return_matchs.append((teams[n - 1 - i], teams[i]))
    teams.insert(1, teams.pop())
    fixtures.insert(len(fixtures)/2, matchs)
    fixtures.append(return_matchs)
    matchs = []
    return_matchs = []

for fixture in fixtures:
    print fixture
Run Code Online (Sandbox Code Playgroud)

输出:

[('Team1', 'Team6'), ('Team2', 'Team5'), ('Team3', 'Team4')]
[('Team1', 'Team5'), ('Team6', 'Team4'), ('Team2', 'Team3')]
[('Team1', 'Team4'), ('Team5', 'Team3'), ('Team6', 'Team2')]
[('Team1', 'Team3'), ('Team4', 'Team2'), ('Team5', 'Team6')]
[('Team1', 'Team2'), ('Team3', 'Team6'), ('Team4', 'Team5')]
[('Team6', 'Team1'), ('Team5', 'Team2'), ('Team4', 'Team3')]
[('Team5', 'Team1'), ('Team4', 'Team6'), ('Team3', 'Team2')]
[('Team4', 'Team1'), ('Team3', 'Team5'), ('Team2', 'Team6')]
[('Team3', 'Team1'), ('Team2', 'Team4'), ('Team6', 'Team5')]
[('Team2', 'Team1'), ('Team6', 'Team3'), ('Team5', 'Team4')]
Run Code Online (Sandbox Code Playgroud)