任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5,3,2、1,前三名的积分分别为:5,3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20)
功能要求:
(1)可以输入各个项目的前三名或前五名的成绩;
(2)能统计各学校总分,
(3)可以按学校编号或名称,学校总分、男女团体总分排序输出;
(4)可以按学校编号查询学校某个项目的情况;
(5)数据存入文件并能随时查询
def inputgrade():
dic = {}
for i in range(n):
lst = map(int, input('第{}个项目的前三名成绩'.format(i+1)).split())
dic[i] = lst
return dic
n = int(input('学校数量:'))
grades = inputgrade()
import itertools as it
school_items = {}
pre_head = {}
scores = {3: [5, 3, 2],5: [7, 5, 3, 2, 1],}
def setValue():
global n
global m
global w
global schools
global items
global items_man
global items_womans
n, m, w = map(int, input("学校n,男项m,女项w:").split())
schools = range(1, n + 1)
items = list(range(1, m + w + 1))
items_man = items[:m]
items_womans = items[m:]
def set_school_itemsAndScore():
for i in schools:
school_items[i] = input(f"学校{i}参加的项目及得分,格式为:项目号[得分1,得分2...](每组用空格隔开):").split()
def set_item_pre():
for _ in items:
pre_head[_] = int(input(f"项目{_}选前第几名(3或5):"))
print(pre_head)
def get_schools_score(school = None):
lst_school_items, dic_item_score = get_schools_info(school)
result = sorted(dic_item_score, key = lambda x: (x[1], -x[2]))
rr = it.groupby(result, key = lambda x: x[1])
school_score_all = {}
for i, j in rr:
l = list(j)
r = list(zip(l[:pre_head[i]] , scores[pre_head[i]]))
for k in r:
school_score_all[k[0][1]] = school_score_all.get(k[0][1], 0) + k[1]
return school_score_all if school == None else school_score_all[school]
def get_schools_info(schools = None):
lst_school_item = {}
lst_school_items = {}
dic_item_score = []
for k,item_content in school_items.items():
school_name = k
lst_school_item[k] = []
_d = {}
for i in item_content:
pos = i.find("[")
item_code = int(i[:pos])
item_score = eval(i[pos:])
_d[item_code]=_d.get(item_code, [])+[item_score]
lst_school_item[k].append(item_code)# 学校参加的项目号
dic_item_score.extend([(school_name, item_code, sc) for sc in item_score]) # 所有的 学校:项目:分数
lst_school_items[school_name] = _d.copy()
return lst_school_items , dic_item_score
s = "1.输入学校数、男项目数、女项目数(用空格隔开)\n" \
"2.设定每个项目成绩选前几名\n" \
"3.学校的项目及得分,格式为:项目号(分数)【每组数空格隔开】\n" \
"4.统计各学校的总分\n" \
"5.查询某学校的项目情况.\n" \
"Q.退出"
print(s)
while 1:
item = input("请输入操作选项:")
if item == '1' :
setValue()
print(f"共有{n}所学校参加{m+w}项比赛,其中男子{m}项,女子{w}项!")
elif item == '2':
set_item_pre()
print(f"每个项目选择前几名设定完成!")
elif item =='3':
set_school_itemsAndScore()
print("学校每个项目得分情况设定完成!")
elif item == '4':
res = get_schools_score()
print(res)
elif item == '5':
sc = input("请输入学校号(不输则为全部信息):")
res = get_schools_info()
if sc:
rr = res[0][int(sc)]
else:
rr = res[0]
print(rr)
elif item == 'Q':
print("退出系统!")
break
这里我不知道你数据保存有没有什么要求,就没有写
大概就这样子,还有什么要求吗?
import pprint
N = 0# 学校数(自定)
M = 0# 男子项目数(自定)
W = 0# 女子项目数(自定)
class School:
'''
学校类
'''
def __init__(self):
self.man = {'男子%s'%i:0 for i in range(1,M+1)}
self.woman = {'女子%s'%i:0 for i in range(M+1,M+W+1)}
def score(self):
'''
统计学校总分
'''
return sum(self.man.values())+sum(self.woman.values())
def set_socre(self,sex:str,num:int,value:int):
'''
设置某个项目得分
'''
if sex == 'man':
self.man['男子%s'%num] = value
else:
self.woman['女子%s'%num] = value
schooldic = {n:School() for n in range(1,N+1)}#初始化学校编号字典
def save():
'''
保存文件数据到 data.txt 文件中
'''
with open('data.txt','a') as file:
pass
while True:
print('-----【功能选择】-----')
print('【1】输入某个项目的前三名或前五名的成绩')
print('【2】统计各学校总分')
print('【3】按学校编号或名称,学校总分、男女团体总分排序输出')
print('【4】按学校编号查询学校某个项目的情况')
print('【5】数据存入文件并能随时查询')
n = input('【选择】')
if n == '1':# 输入某个项目的前三名或前五名的成绩
obj = input('【输入项目号】')
lis = eval(input('【输入成绩】'))
for num,value in lis:# num为学校编码,value为得分
if obj[:2] == '男子':
schooldic[num].man[obj] = value
if obj[:2] == '女子':
schooldic[num].woman[obj] = value
elif n == '2':# 统计各学校总分
outdic = {'学校%s'%i:schooldic[i].score() for i in range(1,N+1)}
pprint.pprint(outdic)
elif n == '3':# 按学校编号或名称,学校总分、男女团体总分排序输出
outdic = {'学校%s'%i:[schooldic[i].score(),sum(schooldic[i].man),sum(schooldic[i].woman)] for i in range(1,N+1)}
pprint.pprint(outdic)
elif n == '4':# 按学校编号查询学校某个项目的情况
num = input('【输入学校编号】')
obj = input('【输入项目号】')
if obj[:2] == '男子':
print(schooldic[int(num)].man[obj])
if obj[:2] == '女子':
print(schooldic[int(num)].woman[obj])
elif n == '5':# 数据存入文件并能随时查询
save()
print('【已保存】')
else:
print('【输入有误,请重新输入】')
continue
其实问题中还有很多不明确的地方,比如:
m<=20
,是否w
也应该有w<=20
甚至 w<=m
上述问题都影响具体的实现。
根据上面的一些情况,对前面 小康的代码进行较大修改如下:
import pprint
import json
N = 5# 学校数(自定)
M = 3# 男子项目数(自定)
W = 3# 女子项目数(自定)
S3=[5,3,2] # 前3名对应积分
S5=[7,5,3,2,1] # 前5名对应积分
schooldic = {str(n):{'man':{'男子%s'%i:0 for i in range(1,M+1)},'woman':{'女子%s'%i:0 for i in range(1,W+1)}} for n in range(1,N+1)}#初始化学校编号字典
#pprint.pprint(schooldic)
def save():
'''
保存文件数据到 data.json文件中,
'''
global schooldic
with open('data.json','w') as file:
json_str=json.dumps(schooldic,skipkeys=True,ensure_ascii=False)
file.write(json_str)
file.close()
def load():
'''
读取保存文件数据 data.json文件到系统中,
'''
global schooldic
with open('data.json','r') as file:
schooldic = json.load(file)
print(schooldic)
file.close()
while True:
print('-----【功能选择】-----')
print('【1】输入某个项目的前三名或前五名的成绩(对应学校ID排序)')
print('【2】统计各学校总分')
print('【3】按学校编号或名称,学校总分、男女团体总分排序输出')
print('【4】按学校编号查询学校某个项目的情况')
print('【5】数据存入文件并能随时查询')
print('【6】导入保存的数据存入文件来查询')
print('【0】退出系统')
n = input('【选择】').strip()
if n == '1':# 输入某个项目的前三名或前五名的成绩
obj = int(input('【输入项目号】'))
alist =list(((input('【输入成绩排名情况,要么3个要么5个学校id号,中间用空格隔开】')).strip()).split(" "))
#lis 从前到后分别是对应学校ID
alen = len(alist)
S=''
if (alen==3):
S=S3
elif (alen == 5):
S=S5
if (S==''):
print('Err!输入成绩排名情况不符合要求!')
else:
for i in range(1,N+1):# 先清除对应项目各校得分
if obj<=M:
schooldic[str(i)]['man']['男子%s'%obj]=0
else:
schooldic[str(i)]['woman']['女子%s'%(obj-M)]=0
for i in range(alen):# 根据输入的情况设置各校得分
if obj<=M:
schooldic[alist[i]]['man']['男子%s'%obj]+=S[i]
else:
schooldic[alist[i]]['woman']['女子%s'%(obj-M)]+=S[i]
elif n == '2':# 统计各学校总分
outdic = {'学校%s'%i:sum((schooldic[str(i)]['man']).values())+sum((schooldic[str(i)]['woman']).values()) for i in range(1,N+1)}
pprint.pprint(outdic)
elif n == '3':# 按学校编号或名称,学校总分、男女团体总分排序输出
outdic = {'学校%s'%i:[sum((schooldic[str(i)]['man']).values())+sum( (schooldic[str(i)]['woman']).values()),sum((schooldic[str(i)]['man']).values()),sum((schooldic[str(i)]['woman']).values())] for i in range(1,N+1)}
pprint.pprint(outdic)
elif n == '4':# 按学校编号查询学校某个项目的情况
num = input('【输入学校编号】').strip()
obj = int(input('【输入项目号】'))
if obj<=M :
print(schooldic[num]['man']['男子%s'%obj])
else :
print(schooldic[num]['woman']['女子%s'%(obj-M)])
elif n == '5':# 数据存入文件并能随时查询
save()
print('【已保存】')
elif n== '6': # 数据导入处理
load()
print('【已导入,导入情况如上】')
elif n=='0':
print('【退出系统!BYB!】')
break
else:
print('【输入有误,请重新输入】')
continue