From 661df3d168958904f6e3b96d658bf853eaff9cc3 Mon Sep 17 00:00:00 2001 From: TiagoRG <35657250+TiagoRG@users.noreply.github.com> Date: Mon, 30 Jan 2023 16:21:55 +0000 Subject: [PATCH] Heavy refractoring --- 1ano/fp/aula07/campeonato.py | 135 ++++++------------ .../__pycache__/allMatches.cpython-311.pyc | Bin 496 -> 496 bytes 2 files changed, 42 insertions(+), 93 deletions(-) diff --git a/1ano/fp/aula07/campeonato.py b/1ano/fp/aula07/campeonato.py index 93dd187..7a247b8 100644 --- a/1ano/fp/aula07/campeonato.py +++ b/1ano/fp/aula07/campeonato.py @@ -1,133 +1,82 @@ -from extras.allMatches import * # importa a função allMatches criada na aula05 +from extras.allMatches import * # importa a função allMatches criada na aula05 +import math def main(): - equipas = getTeams() # pede as equipas ao utilizador - partidas = allMatches(equipas) # cria a lista de partidas - resultados = getResults(partidas) # pede os resultados ao utilizador - tabela = getTable(equipas, resultados) # cria a tabela de classificação - printTable(tabela) # imprime a tabela de classificação + equipas = getTeams() # pede as equipas ao utilizador + partidas = allMatches(equipas) # cria a lista de partidas + resultados = getResults(partidas) # pede os resultados ao utilizador + tabela = getTable(equipas, resultados) # cria a tabela de classificação + printTable(tabela) # imprime a tabela de classificação def getTeams(): - teams = [] # cria uma lista vazia para as equipas - - while True: # Ciclo para obter as equipas + teams = [] # cria uma lista vazia para as equipas + while True: # Ciclo para obter as equipas team = input("Nome da equipa: ") - if team == "" and len(teams) < 2: + if team in teams: # Garante não haver equipas repetidas continue - elif team == "": - break + if team == "": + if len(teams) < 2: + continue + else: + break teams.append(team) - return teams def getResults(matches): - results = dict() # cria um dicionário vazio para os resultados + results = dict() # cria um dicionário vazio para os resultados for match in matches: - team1, team2 = match # desempacota a partida + team1, team2 = match # desempacota a partida print("Resultado do jogo entre", team1, "e", team2) goals1 = int(input("Golos da equipa 1: ")) goals2 = int(input("Golos da equipa 2: ")) - results[match] = (goals1, goals2) # adiciona o resultado ao dicionário + results[match] = (goals1, goals2) # adiciona o resultado ao dicionário return results def getTable(teams, results): - table = dict() # cria um dicionário vazio para a tabela + table = dict() # cria um dicionário vazio para a tabela + for team in teams: - table[team] = [0, 0, 0, 0, 0, 0] # inicializa a tabela com zeros + table[team] = [0, 0, 0, 0, 0, 0] # inicializa a tabela com as equipas a zeros + for match in results: - team1, team2 = match # desempacota a partida - goals1, goals2 = results[match] # desempacota os resultados - if goals1 > goals2: # se a equipa 1 ganhou - # atualiza os resultados da equipa 1 - table[team1][0] += 1 - table[team1][3] += goals1 - table[team1][4] += goals2 - table[team1][5] += 3 + team1, team2 = match # desempacota a partida + goals1, goals2 = results[match] # desempacota os resultados - # atualiza os resultados da equipa 2 - table[team2][2] += 1 - table[team2][3] += goals2 - table[team2][4] += goals1 - elif goals2 > goals1: # se a equipa 2 ganhou - # atualiza os resultados da equipa 2 - table[team2][0] += 1 - table[team2][3] += goals2 - table[team2][4] += goals1 - table[team2][5] += 3 + # atualiza os resultados da equipa 1 + updateStats(table, team1, goals1, goals2) - # atualiza os resultados da equipa 1 - table[team1][2] += 1 - table[team1][3] += goals1 - table[team1][4] += goals2 - else: # se houve empate - # atualiza os resultados da equipa 1 - table[team1][1] += 1 - table[team1][3] += goals1 - table[team1][4] += goals2 - table[team1][5] += 1 + # atualiza os resultados da equipa 2 + updateStats(table, team2, goals2, goals1) - # atualiza os resultados da equipa 2 - table[team2][1] += 1 - table[team2][3] += goals2 - table[team2][4] += goals1 - table[team2][5] += 1 + # devolve a tabela ordenada por pontos, diferença de golos e por último por golos marcados. + return {team: table[team] for team in + sorted(table, key=lambda x: (table[x][5], table[x][3]-table[x][4], table[x][3]), reverse=True)} - sortedTable = sortTable(table) # ordena a tabela por pontos e diferença de golos - return sortedTable + +def updateStats(table, team, gm, gs): + table[team][5] += (points := 1 if gm == gs else (3 if gm > gs else 0)) # calcula os pontos a atribuir à equipa e adiciona à tabela + table[team][math.trunc(2 - points/2)] += 1 # determina o index ao qual atribui o jogo (V/E/D) + table[team][3] += gm # adiciona os golos marcados + table[team][4] += gs # adiciona os golos marcados def printTable(table): print(f"\n{'Equipa':<15}\tV\tE\tD\tGM\tGS\tPts") - for results in table: - print(f"{results:<15}", end="\t") + for team in table: + print(f"{team:<15}", end="\t") - for result in table[results]: - print(result, end="\t") + for team_stat in table[team]: + print(team_stat, end="\t") print('') - print(f"\nA equipa campeã é {max(table, key=lambda x: (table[x][3]- table[x][4]))}.") - - -def sortTable(table): - pointsOrder = [] # cria uma lista vazia para a ordenação por pontos - for team in table: - pointsOrder.append(table[team][5]) # adiciona os pontos à lista - pointsOrder.sort() # ordena a lista de pontos (ordem crescente) - - resultsByPoints = {} # cria um dicionário vazio para os resultados ordenados por pontos - for points in pointsOrder: # percorre a lista de pontos - for team in table: # percorre as equipas - if table[team][5] == points: # se a equipa tiver os pontos - resultsByPoints[team] = table[team] # adiciona a equipa ao dicionário - - goalDiffByTeam = {} # cria um dicionário vazio para a diferença de golos por equipa - for team in table: # percorre as equipas - goalDiffByTeam[team] = table[team][3] - table[team][4] # calcula a diferença de golos da equipa e adiciona ao dicionário - - teamOrder = [] # cria uma lista vazia para a ordenação dos nomes das equipas por diferença de golos - for team1 in resultsByPoints: - for team2 in resultsByPoints: - if resultsByPoints[team1][5] == resultsByPoints[team2][5]: # se as equipas tiverem os mesmos pontos - - if goalDiffByTeam[team1] >= goalDiffByTeam[team2]: # se a diferença de golos da equipa 1 for maior ou igual à da equipa 2 - teamOrder.append(team1) # adiciona a equipa 1 à lista - - else: # se a diferença de golos da equipa 2 for maior - teamOrder.append(team2) # adiciona a equipa 2 à lista - - teamOrder = teamOrder[::-1] # inverte a lista de equipas (ordem decrescente em diferença de golos) - resultsByGoalDiff = {} # cria um dicionário vazio para os resultados ordenados por diferença de golos - for team in teamOrder: - resultsByGoalDiff[team] = resultsByPoints[team] # adiciona os resultados da equipa ao dicionário ordenado por diferença de golos - - return resultsByGoalDiff + print(f"\nA equipa campeã é {list(table.keys())[0]}.") if __name__ == '__main__': diff --git a/1ano/fp/aula07/extras/__pycache__/allMatches.cpython-311.pyc b/1ano/fp/aula07/extras/__pycache__/allMatches.cpython-311.pyc index d1f160b12f077979dd0f168142de3a7225817050..43382872eee0220a8058d86f54f8035f9fee09ef 100644 GIT binary patch delta 20 acmeys{DGN!IWI340}!xXKE9FrDI)+r9|iva delta 20 acmeys{DGN!IWI340}wDP