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合并文本文件示例
Feb 07 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
Python贪心算法实例小结
Apr 22 Python
python 信息同时输出到控制台与文件的实例讲解
May 11 Python
3个用于数据科学的顶级Python库
Sep 29 Python
python hook监听事件详解
Oct 25 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
Oct 31 Python
对Python中TKinter模块中的Label组件实例详解
Jun 14 Python
Django+RestFramework API接口及接口文档并返回json数据操作
Jul 12 Python
Python request中文乱码问题解决方案
Sep 17 Python
python实现经典排序算法的示例代码
Feb 07 Python
Pandas 稀疏数据结构的实现
Jul 25 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
Banner程序
2006/10/09 PHP
linux下 C语言对 php 扩展
2008/12/14 PHP
php下网站防IP攻击代码,超级实用
2010/10/24 PHP
PHP把小数转成整数3种方法
2014/06/30 PHP
如何通过Apache在本地配置多个虚拟主机
2020/07/29 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
javascript 命名空间以提高代码重用性
2008/11/13 Javascript
JavaScript小技巧 2.5 则
2010/09/12 Javascript
jQuery on方法传递参数示例
2014/12/09 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
JS实现的自定义右键菜单实例二则
2015/09/01 Javascript
推荐10 个很棒的 jQuery 特效代码
2015/10/04 Javascript
jQuery简单实现tab选项卡切换效果
2016/06/20 Javascript
bootstrap下拉列表与输入框组结合的样式调整
2016/10/08 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
2016/12/01 Javascript
js模拟微博发布消息
2017/02/23 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
vuex中的 mapState,mapGetters,mapActions,mapMutations 的使用
2018/04/13 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
Vue 技巧之控制父类的 slot
2020/02/24 Javascript
JS实现前端动态分页码代码实例
2020/06/02 Javascript
Python的Django框架中设置日期和字段可选的方法
2015/07/17 Python
python 异常处理总结
2016/10/18 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
Python 对象中的数据类型
2017/05/13 Python
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
html5唤起app的方法
2017/11/30 HTML / CSS
ShellScript面试题一则-ShellScript编程
2014/06/24 面试题
土木工程建筑专业毕业生求职信
2013/10/21 职场文书
化工机械应届生求职信
2013/11/04 职场文书
学生自我鉴定格式及范文
2014/09/16 职场文书
网吧员工管理制度
2015/08/05 职场文书
Windows中Redis安装配置流程并实现远程访问功能
2021/06/07 Redis
html form表单基础入门案例讲解
2021/07/15 HTML / CSS
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS