使用工具
Excel、PyCharm(Python3.6)
目的
计算十六强队伍各自对阵其余球队的概率
步骤
一、Python分析各队可能的对阵情况
利用python分析出各个队伍可能遇到的对手,逻辑很简单,就不赘述啦。
list1=['拜仁','皇马','曼城','利物浦','切尔西','多特','尤文','巴黎']
list2=['马竞','门兴','波尔图','亚特兰大','塞维利亚','拉齐奥','巴塞罗那','莱比锡']
pairs=[]
# 双方是否能够在淘汰塞第一轮相遇
def isOK(str1,str2):
if str1=='拜仁':
if str2=='门兴':# 同联赛
return False;
elif str2=='马竞':# 同小组
return False;
elif str2=='莱比锡':# 同联赛
return False;
else: return True;
elif str1=='皇马':
if str2=='门兴':# 同小组
return False;
elif str2=='马竞':# 同联赛
return False;
elif str2=='塞维利亚':# 同联赛
return False;
elif str2=='巴塞罗那':# 同联赛
return False;
else: return True;
elif str1=='曼城':
if str2=='波尔图':# 同小组
return False;
else: return True;
elif str1=='利物浦':
if str2=='亚特兰大':# 同小组
return False;
else: return True;
elif str1=='切尔西':
if str2=='塞维利亚':# 同小组
return False;
else: return True;
elif str1=='多特':
if str2=='拉齐奥':# 同小组
return False;
elif str2=='门兴':# 同联赛
return False;
elif str2=='莱比锡':# 同联赛
return False;
else: return True;
elif str1=='尤文':
if str2=='亚特兰大':# 同联赛
return False;
elif str2=='拉齐奥':# 同联赛
return False;
elif str2=='巴塞罗那':# 同小组
return False;
else: return True;
elif str1=='巴黎':
if str2=='莱比锡':# 同小组
return False;
else: return True;
for i in range(len(list1)):
pair=[] # 同一个第一名对阵情况放在一起
for j in range(len(list2)):
if isOK(list1[i],list2[j]):
pair.append(list1[i]+'&'+list2[j])
pairs.append(pair)
这样就可以很轻松得到各队可能的对阵情况
二、Python排列出所有可能的对阵情况
再根据可能的对阵情况,算法逻辑为从各组第一名的list中选一种对阵出来,然后判断这8个对阵中是否有重复队伍,无重复队伍则匹配成功,代码如下:
num=1 # 成功配对数
for a in range(len(pairs[0])):
for b in range(len(pairs[1])):
for c in range(len(pairs[2])):
for d in range(len(pairs[3])):
for e in range(len(pairs[4])):
for f in range(len(pairs[5])):
for g in range(len(pairs[6])):
for h in range(len(pairs[7])):
clubs = []
# a
club=pairs[0][a].split('&')
for i in range(len(club)):
clubs.append(club[i])
# b
club = pairs[1][b].split('&')
for i in range(len(club)):
clubs.append(club[i])
# c
club = pairs[2][c].split('&')
for i in range(len(club)):
clubs.append(club[i])
# d
club = pairs[3][d].split('&')
for i in range(len(club)):
clubs.append(club[i])
# e
club = pairs[4][e].split('&')
for i in range(len(club)):
clubs.append(club[i])
# f
club = pairs[5][f].split('&')
for i in range(len(club)):
clubs.append(club[i])
# g
club = pairs[6][g].split('&')
for i in range(len(club)):
clubs.append(club[i])
# h
club = pairs[7][h].split('&')
for i in range(len(club)):
clubs.append(club[i])
clubs=set(clubs)
if len(clubs)==16:
print('第'+str(num)+'种分组方案:'+pairs[0][a]+','+pairs[1][b]+','+pairs[2][c]+','+
pairs[3][d]+','+pairs[4][e]+','+pairs[5][f]+','+pairs[6][g]+','+pairs[7][h])
num=num+1;
至此就可以得出所有可能的对阵情况,共3305种
三、Excel计算各队对阵情况概率
先把输出的3000+种情况复制到excel中,通过分隔功能存储好
然后用矩阵形式准备计算俩俩之间的概率,公式如下:=COUNTIF(Sheet1!$B
2
:
2:
2:I$3306,CONCATENATE(Sheet4!EKaTeX parse error: Expected 'EOF', got '&' at position 5: 16,"&̲",Sheet4!D17))/3305
为了方便观看,增加一个条件判断,让其颜色不一致
此时,就可以看出对阵情况的概率分布了。