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中装饰器的用法
Apr 27 Python
PyQt5主窗口动态加载Widget实例代码
Feb 07 Python
python爬虫爬取淘宝商品信息
Feb 23 Python
python实现泊松图像融合
Jul 26 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
Oct 29 Python
Python获取网段内ping通IP的方法
Jan 31 Python
python实现一个简单的udp通信的示例代码
Feb 01 Python
哪些是python中web开发框架
Jun 17 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
Jul 14 Python
推荐值得学习的12款python-web开发框架
Aug 10 Python
Python实现老照片修复之上色小技巧
Oct 16 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
Sep 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模板算术运算相关函数用法分析
2016/07/12 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
2016/09/30 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
flexigrid 参数说明
2010/11/23 Javascript
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
基于JavaScript实现智能右键菜单
2016/03/02 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
Vuex的实战使用详解
2019/10/31 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
Python字符串切片操作知识详解
2016/03/28 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
python用opencv批量截取图像指定区域的方法
2019/01/24 Python
Django框架验证码用法实例分析
2019/05/10 Python
python使用pygame模块实现坦克大战游戏
2020/03/25 Python
python自动发微信监控报警
2019/09/06 Python
python 字典的打印实现
2019/09/26 Python
Python的控制结构之For、While、If循环问题
2020/06/30 Python
python之语音识别speech模块
2020/09/09 Python
python中doctest库实例用法
2020/12/31 Python
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
2013/01/09 HTML / CSS
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
机电一体化职业规划书
2014/01/07 职场文书
国际商务专业求职信
2014/07/15 职场文书
党员民主评议总结
2014/10/20 职场文书
学生检讨书范文
2014/10/30 职场文书
个人委托函范文
2015/01/29 职场文书
新郎婚礼致辞
2015/07/27 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
MySQL笔记 —SQL运算符
2022/01/18 MySQL
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS