Roberto - 9 months ago 86

Python Question

I would like to write a League Fixture generator in python, but I can't. Here is the details:

There is a dynamic list of teams like

`teams = ["Team1", "Team2", "Team3", "Team4"]`

How can I generate a fixture_weekx list from the teams list? For example:

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

Any idea?

Answer

Fixture scheduling is a well known problem. This is python implementation of algorithm given at: 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
```

This generates output:

```
[('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')]
```

Source (Stackoverflow)