用python怎么做

任务:参加运动会有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

img

【有帮助请采纳】

这里我不知道你数据保存有没有什么要求,就没有写
大概就这样子,还有什么要求吗?

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

【有帮助请采纳】

其实问题中还有很多不明确的地方,比如:

  1. 每个学校只能派1名队员参加某个项目,还是允许多人?如果允许多人,就可能存在一个学校获得某个具体层次项目多个积分的可能,怎么给出?
  2. 每个学校一个项目成绩怎么给出?通过学校ID排序给出,还是直接给积分对应项目积分?
  3. 根据已知规则,项目ID其实可以直接区分男女项目,查询的时候是否应该直接根据这个项目ID来查询?
  4. 因为项目可以是前3有积分,也可以是前5有积分,这就表明每个项目前需要确定得分类型?是否是这样的?
  5. 条件中给出了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