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 cx_freeze打包工具处理问题思路及解决办法
Feb 13 Python
python django事务transaction源码分析详解
Mar 17 Python
python使用RNN实现文本分类
May 24 Python
Python 读写文件的操作代码
Sep 20 Python
如何使用pyinstaller打包32位的exe程序
May 26 Python
Python+opencv 实现图片文字的分割的方法示例
Jul 04 Python
python列表每个元素同增同减和列表元素去空格的实例
Jul 20 Python
python3实现弹弹球小游戏
Nov 25 Python
Ranorex通过Python将报告发送到邮箱的方法
Jan 12 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
Apr 08 Python
使用Keras中的ImageDataGenerator进行批次读图方式
Jun 17 Python
Python scrapy爬取小说代码案例详解
Jul 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 开发工具
2006/12/06 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
基于jquery的多功能软键盘插件
2012/07/25 Javascript
JavaScript中的console.trace()函数介绍
2014/12/29 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
JS简单实现城市二级联动选择插件的方法
2015/08/19 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
2016/10/10 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
2016/10/20 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
2017/04/01 Javascript
解决webpack打包速度慢的解决办法汇总
2017/07/06 Javascript
vue组件 $children,$refs,$parent的使用详解
2017/07/31 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
vue项目中引入Sass实例方法
2019/08/27 Javascript
JavaScript编写开发动态时钟
2020/07/29 Javascript
详解Vue3 Teleport 的实践及原理
2020/12/02 Vue.js
js实现弹幕墙效果
2020/12/10 Javascript
在Python中调用ggplot的三种方法
2015/04/08 Python
wxpython中自定义事件的实现与使用方法分析
2016/07/21 Python
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
Django中的Model操作表的实现
2018/07/24 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
利用Python实现Excel的文件间的数据匹配功能
2020/06/16 Python
canvas使用注意点总结
2013/07/19 HTML / CSS
Clarks鞋法国官方网站:英国其乐鞋品牌
2018/02/11 全球购物
阿根廷在线宠物商店:Puppis
2018/03/23 全球购物
.NET是怎么支持多种语言的
2015/02/24 面试题
小学后勤管理制度
2014/01/14 职场文书
细节决定成败演讲稿
2014/05/12 职场文书
优秀乡村医生事迹材料
2014/05/28 职场文书
本科毕业生求职信
2014/06/15 职场文书
就业协议书样本
2014/08/20 职场文书
2014年教师工作总结
2014/11/10 职场文书
家属慰问信
2015/02/14 职场文书
python 如何执行控制台命令与操作剪切板
2021/05/20 Python