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简单实现Base64编码和解码的方法
Apr 29 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
Mar 05 Python
使用python生成杨辉三角形的示例代码
Aug 29 Python
python 解压pkl文件的方法
Oct 25 Python
python Pexpect 实现输密码 scp 拷贝的方法
Jan 03 Python
python 格式化输出百分号的方法
Jan 20 Python
Python猴子补丁知识点总结
Jan 05 Python
Python decorator拦截器代码实例解析
Apr 04 Python
django序列化时使用外键的真实值操作
Jul 15 Python
python代码能做成软件吗
Jul 24 Python
matplotlib对象拾取事件处理的实现
Jan 14 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
Jan 24 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列出MySQL中所有数据库的方法
2015/03/12 PHP
php中二分法查找算法实例分析
2016/09/22 PHP
PHP的消息通信机制测试实例
2016/11/10 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
PHP使用反向Ajax技术实现在线客服系统详解
2019/07/01 PHP
List Installed Software Features
2007/06/11 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
js indexOf()定义和用法
2012/10/21 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
基于JavaScript实现窗口拖动效果
2017/01/18 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
AngularJS页面带参跳转及参数解析操作示例
2017/06/28 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
爬山算法简介和Python实现实例
2014/04/26 Python
详解python中的json的基本使用方法
2016/12/21 Python
python验证码识别实例代码
2018/02/03 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
python 读取yaml文件的两种方法(在unittest中使用)
2020/12/01 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
CSS3中设置3D变形的transform-style属性详解
2016/05/23 HTML / CSS
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
人力资源作业细则
2014/03/03 职场文书
教师节促销方案
2014/03/22 职场文书
环保建议书300字
2014/05/14 职场文书
领导班子四风对照检查材料范文
2014/09/27 职场文书
捐助感谢信
2015/01/22 职场文书
三方协议书
2015/01/27 职场文书
2015国庆节感想
2015/08/04 职场文书
SQL语句中JOIN的用法场景分析
2021/07/25 SQL Server
基于python定位棋子位置及识别棋子颜色
2021/07/26 Python