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 08 Python
python解析发往本机的数据包示例 (解析数据包)
Jan 16 Python
Python使用内置json模块解析json格式数据的方法
Jul 20 Python
Python实现读取txt文件并画三维图简单代码示例
Dec 09 Python
用python实现k近邻算法的示例代码
Sep 06 Python
python中使用 xlwt 操作excel的常见方法与问题
Jan 13 Python
Numpy中的数组搜索中np.where方法详细介绍
Jan 08 Python
python Protobuf定义消息类型知识点讲解
Mar 02 Python
python实现批量提取指定文件夹下同类型文件
Apr 05 Python
Python如何利用正则表达式爬取网页信息及图片
Apr 17 Python
python 定义函数 返回值只取其中一个的实现
May 21 Python
常用的Python代码调试工具总结
Jun 23 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
ThinkPHP让分页保持搜索状态的方法
2014/07/02 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
php上传大文件设置方法
2016/04/14 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
BootStrap便签页的简单应用
2017/01/06 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
2017/02/20 Javascript
Vue键盘事件用法总结
2017/04/18 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
python执行使用shell命令方法分享
2017/11/08 Python
微信跳一跳python代码实现
2018/01/05 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
Java与Python两大幸存者谁更胜一筹呢
2018/04/12 Python
python获取当前目录路径和上级路径的实例
2018/04/26 Python
django框架自定义用户表操作示例
2018/08/07 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
解决pip安装的第三方包在PyCharm无法导入的问题
2020/10/15 Python
python tkinter的消息框模块(messagebox,simpledialog)
2020/11/07 Python
欧洲著名的珠宝和手表网上商城:uhrcenter
2017/04/10 全球购物
Giglio英国站:意大利奢侈品购物网
2018/03/06 全球购物
当当网官方旗舰店:中国图书销售夺金品牌
2018/04/02 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
《石榴》教学反思
2014/03/02 职场文书
助理政工师申报材料
2014/06/03 职场文书
煤矿安全知识竞赛活动总结
2014/07/07 职场文书
红旗渠导游词
2015/02/09 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python