Heavy refractoring
This commit is contained in:
parent
38f4e5c515
commit
b50f73d1b3
|
@ -1,4 +1,5 @@
|
||||||
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():
|
def main():
|
||||||
|
@ -11,15 +12,16 @@ def main():
|
||||||
|
|
||||||
def getTeams():
|
def getTeams():
|
||||||
teams = [] # cria uma lista vazia para as equipas
|
teams = [] # cria uma lista vazia para as equipas
|
||||||
|
|
||||||
while True: # Ciclo para obter as equipas
|
while True: # Ciclo para obter as equipas
|
||||||
team = input("Nome da equipa: ")
|
team = input("Nome da equipa: ")
|
||||||
if team == "" and len(teams) < 2:
|
if team in teams: # Garante não haver equipas repetidas
|
||||||
continue
|
continue
|
||||||
elif team == "":
|
if team == "":
|
||||||
|
if len(teams) < 2:
|
||||||
|
continue
|
||||||
|
else:
|
||||||
break
|
break
|
||||||
teams.append(team)
|
teams.append(team)
|
||||||
|
|
||||||
return teams
|
return teams
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,98 +38,45 @@ def getResults(matches):
|
||||||
|
|
||||||
def getTable(teams, 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:
|
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:
|
for match in results:
|
||||||
team1, team2 = match # desempacota a partida
|
team1, team2 = match # desempacota a partida
|
||||||
goals1, goals2 = results[match] # desempacota os resultados
|
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
|
|
||||||
|
|
||||||
# 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
|
# atualiza os resultados da equipa 1
|
||||||
table[team1][2] += 1
|
updateStats(table, team1, goals1, goals2)
|
||||||
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
|
# atualiza os resultados da equipa 2
|
||||||
table[team2][1] += 1
|
updateStats(table, team2, goals2, goals1)
|
||||||
table[team2][3] += goals2
|
|
||||||
table[team2][4] += goals1
|
|
||||||
table[team2][5] += 1
|
|
||||||
|
|
||||||
sortedTable = sortTable(table) # ordena a tabela por pontos e diferença de golos
|
# devolve a tabela ordenada por pontos, diferença de golos e por último por golos marcados.
|
||||||
return sortedTable
|
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)}
|
||||||
|
|
||||||
|
|
||||||
|
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):
|
def printTable(table):
|
||||||
|
|
||||||
print(f"\n{'Equipa':<15}\tV\tE\tD\tGM\tGS\tPts")
|
print(f"\n{'Equipa':<15}\tV\tE\tD\tGM\tGS\tPts")
|
||||||
|
|
||||||
for results in table:
|
for team in table:
|
||||||
print(f"{results:<15}", end="\t")
|
print(f"{team:<15}", end="\t")
|
||||||
|
|
||||||
for result in table[results]:
|
for team_stat in table[team]:
|
||||||
print(result, end="\t")
|
print(team_stat, end="\t")
|
||||||
|
|
||||||
print('')
|
print('')
|
||||||
|
|
||||||
print(f"\nA equipa campeã é {max(table, key=lambda x: (table[x][3]- table[x][4]))}.")
|
print(f"\nA equipa campeã é {list(table.keys())[0]}.")
|
||||||
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue