每年意甲德甲英超西甲各大联赛的赛程表都是球迷们的必看之物,想起之前写过的一段生成赛程表的代码,用Python来写这类东西太舒服了。
这个算法叫做蛇环算法。
即,把所有球队排成一个环形(2列),左边对阵右边,第一支队伍不动,其他队伍顺时针循环,这样就肯定不重复了。
为了方便说明,假设有8支球队a到h。像下面那样按环形排好。
这样,第1轮的对阵就是,(a,h)(b,g)(c,f)(d,e)。
下一轮的时候,第一支球队a不动,其它球队像齿轮一样顺时针走一格。
这样,第2轮的对阵就是,(a,b)(c,h)(d,g)(e,f)。
齿轮继续滑动,直到回到原点,这样每支球队都跟其它所有7支球队对阵了。
千言不如一码。拿英超为例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
from collections import deque import random def build_schedule(_teamarr): scheduleobj = dict .fromkeys( range ( 1 , 20 )) fixpos = _teamarr[ 0 ] ring = _teamarr[ 1 :] ring = deque(ring) #前半赛程,1-19轮(round) for round in range ( 1 , 20 ): #第1支球队不动,再加上轮转(rotate)的环 teams = [fixpos] + list (ring) #切成2列,左边主队,右边客队 home, away = teams[: len (teams) / 2 ],teams[ len (teams) / 2 :] away = away[:: - 1 ] #随机打乱主客队 scheduleobj[ round ] = [(x,y) if random.random()> = 0.5 else (y,x) for x,y in zip (home,away)] ring.rotate( 1 ) #后半赛季对阵跟前半赛季一样,但主客队对调 for round in range ( 20 , 39 ): scheduleobj[ round ] = [(y,x) for x,y in scheduleobj[ round - 19 ]] return scheduleobj if __name__ = = '__main__' : teamarr = [u '曼联' , u '阿斯顿维拉' , u '切尔西' , u '西汉姆' , u '富勒姆' , u '热刺' , u '利物浦' , u '南安普顿' , u '埃弗顿' , u '诺维奇' , u '纽卡斯尔' , u '曼城' , u '斯托克城' , u '桑德兰' , u '水晶宫' , u '西布罗姆维奇' , u '阿森纳' , u '赫尔城' , u '卡迪夫城' , u '斯旺西' ] scheduleobj = build_schedule(teamarr) print u '---联赛第1轮---' for h,a in scheduleobj[ 1 ]: print u '{}-{}' . format (h,a) print u '---联赛第2轮---' for h,a in scheduleobj[ 2 ]: print u '{}-{}' . format (h,a) |