import re
import numpy as np
from tkinter import *
from tkinter import messagebox
from tkinter.filedialog import *
class show_rank(Frame):
def __init__(self,master = None):
Frame.__init__(self,master)
self.grid()
self.CreateWindows()
def CreateWindows(self):
self.arm1 = Frame(self)
self.arm1.pack()
self.arm2 = Frame(self)
self.arm2.pack()
self.arm3 = Frame(self)
self.arm3.pack()
self.str1 = StringVar()
self.str1.set('A')
self.way1 = Radiobutton(self.arm1, text = '查看排名', value = 'A', variable = self.str1)
self.way2 = Radiobutton(self.arm1, text = '优化', value = 'B', variable = self.str1)
self.find_file = askopenfilename(title='askopenfilename', filetypes=[('运动员得分数据','.txt')])
self.lab1 = Label(self.arm2, text = '文件路径')
self.mas1 = Message(self.arm2, bg = 'black', fg = 'white', width = 200)
self.mas1.config(text = self.find_file)
self.butselect = Button(self.arm3, text = '查看', width = 8)
self.butselect['command'] = self.get_rank
self.butquit = Button(self.arm3,text='退出',width = 8,command=root.destroy)
self.butselect.pack(side = LEFT)
self.butquit.pack(side = LEFT)
self.way1.pack(side = LEFT)
self.way2.pack(side = LEFT)
self.lab1.pack(side = LEFT)
self.mas1.pack(side = LEFT)
def get_rank(self):
self.data_solve()
if self.str1.get() == 'A':
self.get_rank1()
messagebox.showinfo('排名',self.fin1_text)
if self.str1.get() == 'B':
self.get_rank2()
messagebox.showinfo('排名',self.fin2_text)
将导入的文件转换为float类型的矩阵,每一行存放运动员的得分。
def data_solve(self):
filename = self.find_file
with open(filename) as f:
self.data1 = f.read()
self.data2 = list(map(float,re.findall('\d\.\d',self.data1)))
step = 12
self.data2 = np.mat([self.data2[i:i+step] for i in range(0,len(self.data2),step)])
self.Grades1 = self.data2.tolist()
self.Grades2 = list.copy(self.Grades1)
self.Grades3 = list.copy(self.Grades1)
def get_rank2(self):
master_max = np.zeros(12,dtype=int).tolist()
master_min = np.zeros(12,dtype=int).tolist()
for mas in range(0,10):
master_max[self.Grades2[mas].index(max(self.Grades2[mas]))] += 1
master_max[self.Grades1[mas].index(max(self.Grades1[mas]))] += 1
master_min[self.Grades2[mas].index(min(self.Grades2[mas]))] += 1
master_min[self.Grades1[mas].index(min(self.Grades1[mas]))] += 1
illegal_master_max = []
illegal_master_min = []
while (True):
illegal_master_max.append(master_max.index(max(master_max)))
illegal_master_min.append(master_min.index(max(master_min)))
if (len(illegal_master_max) == 2) and (len(illegal_master_min) == 2):
break
master_max[master_max.index(max(master_max))] = 0
master_min[master_min.index(max(master_min))] = 0
temp2 = []
for sp in range(0,10):
Grade_max_master = self.Grades3[sp].index(max(self.Grades3[sp]))
Grade_min_master = self.Grades3[sp].index(min(self.Grades3[sp]))
if Grade_max_master in illegal_master_max :
self.Grades3[sp].remove(max(self.Grades3[sp]))
if Grade_min_master in illegal_master_min :
self.Grades3[sp].remove(min(self.Grades3[sp]))
temp2.append(np.mean(self.Grades3[sp]))
self.fina2 = sorted(enumerate(temp2), key=lambda x:x[1])
self.fin2_text = '去掉不合格评委和相应评分后得出运动员排名:\n'
for sps in range(0,10):
self.fin2_text += '第{:2d}名为{:2d}号运动员,得分为{:.2f} \n'.format(sps+1,self.fina2[9-sps][0]+1,self.fina2[9-sps][1])
root = Tk()
root.title('查看排名系统')
root.geometry('300x100+800+400')
win = show_rank(master=root)
win.mainloop()
实验数据:
8.9 9.3 7.9 9.0 8.8 6.5 8.4 6.6 8.2 9.1 9.2 8.8
9.0 7.8 8.7 8.9 9.0 7.6 8.1 6.5 9.6 7.7 6.9 7.5
5.8 7.4 5.3 7.3 9.1 7.9 6.7 6.8 7.8 8.0 7.6 8.1
9.0 7.9 8.3 9.2 7.8 9.2 6.4 6.9 5.8 7.7 8.2 9.0
9.0 8.6 6.9 7.5 5.8 8.6 7.4 6.8 8.4 7.8 9.2 6.7
7.5 9.7 8.9 9.6 7.8 6.5 7.1 8.0 6.6 8.0 8.5 8.9
8.7 7.9 8.8 9.2 7.6 9.1 6.8 9.0 7.8 9.4 8.3 9.2
8.9 7.8 8.7 8.6 8.5 7.4 6.5 9.4 7.7 8.9 6.9 8.4
7.8 8.5 7.6 6.6 8.7 7.8 9.5 7.8 9.9 7.3 8.9 7.7
8.9 7.9 8.8 9.0 7.9 9.2 8.7 8.7 8.9 7.9 8.7 7.7
第一次在CSDN发表文章,不怎么会用Markdown,记录一下。
博主是python小白,如有错误还请指出。