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 Web开发模板引擎优缺点总结
May 06 Python
python绘图库Matplotlib的安装
Jul 03 Python
Python实现遍历windows所有窗口并输出窗口标题的方法
Mar 13 Python
Python比较两个图片相似度的方法
Mar 13 Python
Python构造自定义方法来美化字典结构输出的示例
Jun 16 Python
python处理html转义字符的方法详解
Jul 01 Python
python Pandas 读取txt表格的实例
Apr 29 Python
Python装饰器模式定义与用法分析
Aug 06 Python
python3安装speech语音模块的方法
Dec 24 Python
TensorFlow实现简单的CNN的方法
Jul 18 Python
pytorch AvgPool2d函数使用详解
Jan 03 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
Apr 07 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常用字符串的总结(待续)
2013/06/07 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
js面向对象 多种创建对象方法小结
2012/05/21 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
转换字符串为json对象的方法详解
2013/11/29 Javascript
JS获得浏览器版本和操作系统版本的例子
2014/05/13 Javascript
JS获取当前日期时间并定时刷新示例
2021/03/04 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
jQuery实现宽屏图片轮播实例教程
2015/11/24 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
2016/11/25 Javascript
微信小程序实现的一键连接wifi功能示例
2019/04/24 Javascript
vue+iview分页组件的封装
2020/11/17 Vue.js
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
JS实现公告上线滚动效果
2021/01/10 Javascript
浅析Python中return和finally共同挖的坑
2017/08/18 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
Djang的model创建的字段和参数详解
2019/07/27 Python
pytorch实现对输入超过三通道的数据进行训练
2020/01/15 Python
Python生成器next方法和send方法区别详解
2020/05/30 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
html5小技巧之通过document.head获取head元素
2014/06/04 HTML / CSS
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
建议书怎么写
2014/03/12 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
图书馆标语
2014/06/19 职场文书
校园游戏活动新闻稿
2014/10/15 职场文书
财务整改报告范文
2014/11/05 职场文书
2014年纪委工作总结
2014/12/05 职场文书
职位证明模板
2015/06/23 职场文书
趣味运动会标语口号
2015/12/26 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书