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字符串编码识别模块chardet简单应用
Jun 15 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
Jan 20 Python
Python序列循环移位的3种方法推荐
Apr 09 Python
Python多图片合并PDF的方法
Jan 03 Python
在Python中居然可以定义两个同名通参数的函数
Jan 31 Python
Python高级特性与几种函数的讲解
Mar 08 Python
pycharm显示远程图片的实现
Nov 04 Python
python logging.basicConfig不生效的原因及解决
Feb 20 Python
python opencv 检测移动物体并截图保存实例
Mar 10 Python
Python操作Jira库常用方法解析
Apr 10 Python
python输入中文的实例方法
Sep 14 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
Jun 05 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
一个目录遍历函数
2006/10/09 PHP
php读取本地文件常用函数(fopen与file_get_contents)
2013/09/09 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
PHP使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
PHP 99乘法表的几种实现代码
2020/10/13 PHP
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
js弹出div并显示遮罩层
2014/02/12 Javascript
贴近用户体验的Jquery日期、时间选择插件
2015/08/19 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
vue 父组件调用子组件方法及事件
2018/03/29 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
python 测试实现方法
2008/12/24 Python
Python ZipFile模块详解
2013/11/01 Python
python访问sqlserver示例
2014/02/10 Python
教大家使用Python SqlAlchemy
2016/02/12 Python
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
Python利用itchat对微信中好友数据实现简单分析的方法
2017/11/21 Python
python3爬取数据至mysql的方法
2018/06/26 Python
PyCharm在新窗口打开项目的方法
2019/01/17 Python
python随机在一张图像上截取任意大小图片的方法
2019/01/24 Python
Scrapy框架实现的登录网站操作示例
2020/02/06 Python
Python class的继承方法代码实例
2020/02/14 Python
Python networkx包的实现
2020/02/14 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
美国球鞋寄卖网站:Stadium Goods
2018/05/09 全球购物
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
建筑项目策划书
2014/01/13 职场文书
双方协议书
2014/04/22 职场文书
会计专业自荐信
2014/06/03 职场文书
优秀班主任材料
2014/12/16 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang
「偶像大师 MILLION LIVE!」七尾百合子手办开订
2022/03/21 日漫