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 05 Python
浅谈python多线程和队列管理shell程序
Aug 04 Python
详解Python的Lambda函数与排序
Oct 25 Python
Python2中文处理纪要的实现方法
Mar 10 Python
django连接oracle时setting 配置方法
Aug 29 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 Python
pandas中read_csv的缺失值处理方式
Dec 19 Python
Python安装tar.gz格式文件方法详解
Jan 19 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
Feb 17 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
Apr 22 Python
Python爬虫requests库多种用法实例
May 28 Python
使用pycharm和pylint检查python代码规范操作
Jun 09 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简单遍历对象示例
2016/09/28 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
JavaScript定时器和优化的取消定时器方法
2015/07/03 Javascript
js实现带农历和八字等信息的日历特效
2016/05/16 Javascript
vue.js实现仿原生ios时间选择组件实例代码
2016/12/21 Javascript
详解jQuery事件
2017/01/13 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
nodejs模块学习之connect解析
2017/07/05 NodeJs
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
2018/08/08 Javascript
在vue项目中使用md5加密的方法
2018/09/14 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
基于VUE的v-charts的曲线显示功能
2019/10/01 Javascript
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
小程序实现上下切换位置
2020/11/16 Javascript
[01:15:29]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第三局
2016/03/04 DOTA
[31:29]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第一场 12.20
2020/12/23 DOTA
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
python安装oracle扩展及数据库连接方法
2017/02/21 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
Python中判断子串存在的性能比较及分析总结
2019/06/23 Python
如何通过Python3和ssl实现加密通信功能
2020/05/09 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
python 实现有道翻译功能
2021/02/26 Python
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
学习保证书
2015/01/17 职场文书
2015年度优秀员工获奖感言
2015/07/31 职场文书
2016新年问候语大全
2015/11/11 职场文书
创业计划书之美甲店
2019/09/20 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python
Go语言 go程释放操作(退出/销毁)
2021/04/30 Golang
Kubernetes控制节点的部署
2022/04/01 Servers