最近德甲英超西甲各大联赛重燃战火,想起之前写过的一段生成赛程表的代码,用python来写这类东西太舒服了。

这个算法叫做蛇环算法。

即,把所有球队排成一个环形(2列),左边对阵右边,第一支队伍不动,其他队伍顺时针循环,这样就肯定不重复了。
为了方便说明,假设有8支球队a到h。像下面那样按环形排好。
a h
|   |
b g
|   |
c  f
|   |
d-e
这样,第1轮的对阵就是,(a,h)(b,g)(c,f)(d,e)。
下一轮的时候,第一支球队a不动,其它球队像齿轮一样顺时针走一格。
a b
|   |
c h
|   |
d g
|   |
e-f
这样,第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 scheduleobjif __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 - 赛程表算法相关推荐

  1. Python数据结构与算法(2.7)——跳表

    Python数据结构与算法(2.7)--跳表 0. 学习目标 1. 跳表的基本概念 1.1 跳表介绍 1.2 跳表的性能 1.3 跳表与普通链表的异同 2. 跳表的实现 2.1 跳表结点类 2.2 跳 ...

  2. Python数据结构与算法(2.2)——顺序表

    Python数据结构与算法(2.2)--顺序表 0. 学习目标 1. 线性表的顺序存储结构 1.1 顺序表基本概念 1.2 顺序表的优缺点 1.3 动态顺序表 2. 顺序表的实现 2.1 顺序表的初始 ...

  3. Python数据结构与算法(2.1)——线性表的基本概念

    Python数据结构与算法(2.1)--线性表的基本概念 0. 学习目标 1. 线性表的定义 2. 线性表的操作 3. 抽象数据类型线性表定义 相关链接 0. 学习目标 线性表是应用最为广泛的一种数据 ...

  4. python足球联赛赛程_足球联赛赛程表工作表

    比赛时间 比赛对手 比赛地点 比赛服装 带队领导及教练 11月9日8:50 庐阳中学--五十六中 十九中 穿红带蓝 戴鹏程 罗春光 11月16日8:50 庐阳中学--四十八中 十九中 穿蓝带红 单军  ...

  5. python反三角函数arctan_arctan()函数的查表算法

    目标:实现反正切函数的查表算法,精度0.5°. 分析: f(x) = arctan(x)函数单调但非线性,越接近原点处,斜率越大. 90°比较特殊,其值为正无穷大,只要得到的正切值tana大于114. ...

  6. python数据结构与算法总结

    python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章: <数据结构和算法对python意味着什么?> <顺序表数据结构在python中的应用> ...

  7. 【机器学习基础】数学推导+纯Python实现机器学习算法12:贝叶斯网络

    Python机器学习算法实现 Author:louwill 在上一讲中,我们讲到了经典的朴素贝叶斯算法.朴素贝叶斯的一大特点就是特征的条件独立假设,但在现实情况下,条件独立这个假设通常过于严格,在实际 ...

  8. python数据结构与算法13_python 数据结构与算法 (13)

    python 数据结构与算法 (13) 选择排序 (Selection sort) 是? 种简单直观的排序算法. 它的? 作原理如 下.? 先在未排序序列中找到最?(?)元素, 存放到排序序列的起始位 ...

  9. python 经典排序算法

    python 经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算 ...

最新文章

  1. constrain to margins
  2. Windows Azure Storage (19) 再谈Azure Block Blob和Page Blob
  3. java如何读取下拉列表的值_java - 如何在Selenium 2中选择/获取下拉选项
  4. Android 绑定远程服务出现 Not Allowed to bind service
  5. Android-获取系统的应用程序的信息
  6. Android 系统(66)---Android硬件加速相关问题总结
  7. java toString
  8. 【数字信号去噪】基于matlab小波软阈值+硬阈值+改进阈值数字信号去噪【含Matlab源码 1025期】
  9. jd-gui - 打开jar出现中文乱码问题
  10. android studio使用开源项目,gogo电子竞技-gogo电子竞技
  11. Photoshop设计网站原型图
  12. 计算机网络 路由器的端口ip,教您如何修改路由器LAN端口的IP地址
  13. 基于Java编写的网络五子棋
  14. 史玉柱和郭广昌谈创业团队管理:两种类型的“孔雀王”
  15. 地图分幅编号C 语言编程,地图分幅编号的计算
  16. RAD Studio 11.X Alexandria release有何新的改变及改变实务
  17. python当当网爬虫
  18. 算法导论第三版习题6.4
  19. 实战-Android系统默认关闭内核打印
  20. 编程c语言庄子天下篇,庄子天下篇.doc

热门文章

  1. C++多线程2——亲和性
  2. 嵌入式系统开发笔记7:CJ/T-188 冷热量表协议解析1
  3. PostGIS教程十:空间连接
  4. #Java教程:集合 #Collection、List、Set #ArrayList、LinkedList、Vector、HashSet、TreeSet #一个斗地主小游戏@FDDLC
  5. 数字三角形的多种解法思路
  6. 简单好用的服务器压力测试小工具 ab
  7. 华为服务器故障灯不开机_华为手机开不了机指示灯亮怎么办?
  8. Java 方法参数传递
  9. 基于Unity3D 的Vuforia SDK开发基础教程
  10. iphone铃声制作