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 06 Python
一些Python中的二维数组的操作方法
May 02 Python
Python实现将16进制字符串转化为ascii字符的方法分析
Jul 21 Python
python 实现登录网页的操作方法
May 11 Python
python环形单链表的约瑟夫问题详解
Sep 27 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
Jan 23 Python
解决Python3 控制台输出InsecureRequestWarning问题
Jul 15 Python
对Django中的权限和分组管理实例讲解
Aug 16 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
Aug 30 Python
python圣诞树编写实例详解
Feb 13 Python
Django-Scrapy生成后端json接口的方法示例
Oct 06 Python
python开发实时可视化仪表盘的示例
May 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
关于IIS php调用com组件的权限问题
2012/01/11 PHP
php防注入,表单提交值转义的实现详解
2013/06/10 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
Laravel学习基础之migrate的使用教程
2017/10/11 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
2019/01/16 PHP
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
angular写一个列表的选择全选交互组件的示例
2018/01/22 Javascript
基于vue实现图片验证码倒计时60s功能
2019/12/10 Javascript
JS+HTML5本地存储Localstorage实现注册登录及验证功能示例
2020/02/10 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
[04:16]DOTA2全国高校联赛16强抽签
2018/05/02 DOTA
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
python结合API实现即时天气信息
2016/01/19 Python
python实现折半查找和归并排序算法
2017/04/14 Python
python3爬虫怎样构建请求header
2018/12/23 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
python django中8000端口被占用的解决
2019/12/17 Python
python global和nonlocal用法解析
2020/02/03 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
python 日志模块logging的使用场景及示例
2021/01/04 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
英国花园、DIY、电器和家居用品商店:Robert Dyas
2019/03/18 全球购物
What is view? why do we have view?
2012/06/22 面试题
纺织工程专业个人求职信范文
2014/01/27 职场文书
网页美工求职信
2014/02/15 职场文书
畜牧兽医本科生的自我评价
2014/03/03 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android