class Tabell: def __init__(self, lagliste): self._lagliste = lagliste # Tabellen er en ordbok med Lag-objekt som n?kler # Verdiene er ordb?ker (med strenger som n?kler og tallene i tabellen som verdier) self._tabell = {} for lag in self._lagliste: self._tabell[lag] = {} self._tabell[lag]["navn"] = lag.navn() self._tabell[lag]["kamper"] = 0 self._tabell[lag]["vunnet"] = 0 self._tabell[lag]["uavgjort"] = 0 self._tabell[lag]["tapt"] = 0 self._tabell[lag]["m?l for"] = 0 self._tabell[lag]["m?l mot"] = 0 self._tabell[lag]["poeng"] = 0 # F?r noen kamper er spilt, sorterer vi bare lagene alfabetisk # (siden vi har implementert metodene __lt__ og __gt__ for klassen Lag) self._rangering = sorted(self._lagliste) # Denne metoden legger til resultatet fra en kamp i tabellen def legg_til_resultat(self, kamp): # hent info om kampen - hvem spilte og hva ble resultatet? hjemmelag = kamp.hjemmelag() bortelag = kamp.bortelag() m?l_hjemme = kamp.m?l_hjemme() m?l_borte = kamp.m?l_borte() # oppdater antall spilte kamper self._tabell[hjemmelag]["kamper"] += 1 self._tabell[bortelag]["kamper"] += 1 # oppdater antall vunnet/uavgjort/tapt if m?l_hjemme > m?l_borte: # hjemmelaget vant self._tabell[hjemmelag]["vunnet"] += 1 self._tabell[bortelag]["tapt"] += 1 elif m?l_hjemme == m?l_borte: # uavgjort self._tabell[hjemmelag]["uavgjort"] += 1 self._tabell[bortelag]["uavgjort"] += 1 else: # bortelaget vant self._tabell[hjemmelag]["tapt"] += 1 self._tabell[bortelag]["vunnet"] += 1 # oppdater m?l for begge lag self._tabell[hjemmelag]["m?l for"] += m?l_hjemme self._tabell[bortelag]["m?l for"] += m?l_borte # oppdater m?l imot begge lag self._tabell[hjemmelag]["m?l mot"] += m?l_borte self._tabell[bortelag]["m?l mot"] += m?l_hjemme # oppdater poeng (3 for seier, 1 for uavgjort) self._tabell[hjemmelag]["poeng"] = 3*self._tabell[hjemmelag]["vunnet"] + self._tabell[hjemmelag]["uavgjort"] self._tabell[bortelag]["poeng"] = 3*self._tabell[bortelag]["vunnet"] + self._tabell[bortelag]["uavgjort"] # Denne metoden rangerer lagene p? f?lgende m?te: # # 1) Lag med mest poeng ?verst # 2) Hvis likt antall poeng, lag med best m?lforskjell ?verst # 3) Hvis b?de poeng og m?lforskjell likt, sorter alfabetisk p? lagnavn # # Du trenger ikke forst? HVORDAN denne metoden virker (det er frivillig), # men du tregner ? vite at den sorterer listen self._rangering # slik at lagene kommer i riktig tabell-rekkef?lge def oppdater_rangering(self): gammel_rangering = self._rangering # kopi av rangering fra forrige runde self._rangering = [] while len(gammel_rangering) > 0: # s? lenge det er lag igjen ? rangere # let etter laget/lagene med mest poeng (av de som er igjen) maxpoeng = -1 # (forel?pig) st?rste antall poeng vi har funnet beste_lag = [] # liste med alle lagene p? max poeng for i in range(len(gammel_rangering)): lag = gammel_rangering[i] poeng = self._tabell[lag]["poeng"] if poeng == maxpoeng: # fant enda et lag med samme poengsum beste_lag.append(i) # legg til i listen elif poeng > maxpoeng: # fant en ny og h?yere poengsum beste_lag = [i] # lag ny liste maxpoeng = poeng # n? er dette den nye max-poengsummen # beste_lag inneholder bare indekser til lagene (i listen gammel_rangering) # beste_lagliste inneholder referanser til selve Lag-objektene beste_lagliste = [] for j in beste_lag[::-1]: beste_lagliste.append(gammel_rangering.pop(j)) # fjerner lagene fra gammel_rangering # Blant lagene med max poengsum, gjenta prosessen over med m?lforskjell # (Var det bare ett lag, vil dette legges til i self._rangering) while len(beste_lagliste) > 0: # s? lenge det er flere lag igjen med max poengsum maxm?lforskjell = -9999 # (forel?pig) beste m?lforskjell vi har funnet aller_beste_lagliste = [] # liste med alle lagene p? beste m?lforskjell for lag in beste_lagliste: m?lforskjell = self._tabell[lag]["m?l for"] - self._tabell[lag]["m?l mot"] if m?lforskjell == maxm?lforskjell: # fant enda et lag med samme m?lforskjell aller_beste_lagliste.append(lag) # legg til i listen elif m?lforskjell > maxm?lforskjell: # fant en ny og bedre m?lforskjell aller_beste_lagliste = [lag] # lag ny liste maxm?lforskjell = m?lforskjell # n? er dette den nye beste m?lforskjellen # alfabetisk sortering p? lagnavn hvis alt annet likt (derfor sorted) # fungerer fordi Lag implementerer __gt__ og __lt__ for lag in sorted(aller_beste_lagliste): self._rangering.append(lag) # legger til laget i den nye rangeringen beste_lagliste.remove(lag) # m? fjerne laget fra denne listen s? l?kken ikke g?r uendelig # Returnerer listen med lag i den rekkef?lge de er i tabellen def hent_rangering(self): return self._rangering # Skriver ut tabellen i et fint og leselig format # Skriver ogs? ut gjennomsnittlig antall m?l gjennom sesongen def print_tabell(self): print() print() m?l = 0 # antall m?l scoret kamper = 0 # antall kamper spilt for lag in self.hent_rangering(): m?l += self._tabell[lag]["m?l for"] # m?lene dette laget har scoret kamper += self._tabell[lag]["kamper"] // 2 # hjemmekampene dette laget har spilt # (det er 2 lag per kamp, s? vi teller kampene dobbelt hvis vi ikke deler p? 2) # .ljust() og .rjust() gj?r at tabellen ser fin ut # https://www.w3schools.com/python/ref_string_ljust.asp # https://www.w3schools.com/python/ref_string_rjust.asp print(self._tabell[lag]["navn"].ljust(14), str(self._tabell[lag]["kamper"]).ljust(2), str(self._tabell[lag]["vunnet"]).ljust(2), str(self._tabell[lag]["uavgjort"]).ljust(2), str(self._tabell[lag]["tapt"]).ljust(2), str(self._tabell[lag]["m?l for"]).rjust(3), "-", str(self._tabell[lag]["m?l mot"]).ljust(3), str(self._tabell[lag]["poeng"]).ljust(3) ) print() print("Gjennomsnittlig antall m?l:", round(m?l/kamper, 2)) # runder av til 2 desimaler