Python设计足球联赛赛程表程序的思路与简单实现示例


Posted in Python onJune 28, 2016

每年意甲德甲英超西甲各大联赛的赛程表都是球迷们的必看之物,想起之前写过的一段生成赛程表的代码,用Python来写这类东西太舒服了。
这个算法叫做蛇环算法。
即,把所有球队排成一个环形(2列),左边对阵右边,第一支队伍不动,其他队伍顺时针循环,这样就肯定不重复了。
为了方便说明,假设有8支球队a到h。像下面那样按环形排好。

Python设计足球联赛赛程表程序的思路与简单实现示例

这样,第1轮的对阵就是,(a,h)(b,g)(c,f)(d,e)。
下一轮的时候,第一支球队a不动,其它球队像齿轮一样顺时针走一格。

Python设计足球联赛赛程表程序的思路与简单实现示例

这样,第2轮的对阵就是,(a,b)(c,h)(d,g)(e,f)。
齿轮继续滑动,直到回到原点,这样每支球队都跟其它所有7支球队对阵了。

千言不如一码。拿英超为例。

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)

Python设计足球联赛赛程表程序的思路与简单实现示例

Python 相关文章推荐
Python编程之属性和方法实例详解
May 19 Python
详解Python的Django框架中Manager方法的使用
Jul 21 Python
python目录与文件名操作例子
Aug 28 Python
Python编程对列表中字典元素进行排序的方法详解
May 26 Python
python操作列表的函数使用代码详解
Dec 28 Python
django初始化数据库的实例
May 27 Python
pandas进行时间数据的转换和计算时间差并提取年月日
Jul 06 Python
python输出决策树图形的例子
Aug 09 Python
python matplotlib库直方图绘制详解
Aug 10 Python
在Python中画图(基于Jupyter notebook的魔法函数)
Oct 28 Python
python实现的Iou与Giou代码
Jan 18 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
Apr 29 Python
详解Python中heapq模块的用法
Jun 28 #Python
Python中operator模块的操作符使用示例总结
Jun 28 #Python
基础的十进制按位运算总结与在Python中的计算示例
Jun 28 #Python
Python中的with语句与上下文管理器学习总结
Jun 28 #Python
深入解析Python中的上下文管理器
Jun 28 #Python
详解Python中contextlib上下文管理模块的用法
Jun 28 #Python
实例讲解Python中SocketServer模块处理网络请求的用法
Jun 28 #Python
You might like
php 运行效率总结(提示程序速度)
2009/11/26 PHP
PHP持久连接mysql_pconnect()函数使用介绍
2012/02/05 PHP
php数组查找函数总结
2014/11/18 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
PJ Blog修改-禁止复制的代码和方法
2006/10/25 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
bootstrap实现弹窗和拖动效果
2016/01/03 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
Vue.js中的computed工作原理
2018/03/22 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
在mpvue框架中使用Vant WeappUI组件库的注意事项【推进】
2019/06/09 Javascript
javascript实现页面的实时时钟显示示例
2020/08/06 Javascript
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
python奇偶行分开存储实现代码
2018/03/19 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
Python urlencode和unquote函数使用实例解析
2020/03/31 Python
python实现人脸签到系统
2020/04/13 Python
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
中科方德软件测试面试题
2016/04/21 面试题
银行职业规划书范文
2013/12/28 职场文书
中餐厅主管的职责范文
2014/02/04 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
国培计划培训感言
2014/03/11 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
2016年五一国际劳动节活动总结
2016/04/06 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
Python re.sub 反向引用的实现
2021/07/07 Python
python数字类型和占位符详情
2022/03/13 Python