5

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"]

何か案が?

4

3 に答える 3

9

フィクスチャのスケジューリングはよく知られている問題です。これは、http: //en.wikipedia.org/wiki/Round-robin_tournamentにあるアルゴリズムの Python 実装です。

# 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

これにより、次の出力が生成されます。

[('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')]
于 2012-06-28T13:57:18.597 に答える
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]))
于 2016-10-20T18:29:45.340 に答える