TurkuPythonExercises / Week 7 Libraries and More Python /16. Sort by the difference of goals
KaiquanMah's picture
SORT INPLACE. list.sort(key=some_inner_fn)
bade301 verified
raw
history blame
5.44 kB
'''
Write a function
sortby_goalsdiff(teams: list)
which takes as parameter a list of tuples. A single tuple represents the team's result for the current season. The first element of the tuple is the team name (string). The second element is also a string: it represents the goals scored and conceded by the team during the season. So an example of a tuple could be
("TPS", "201 - 51")
The goal difference is calculated by subtracting the goals conceded by the team from the goals scored. In this example, the goal difference would be 150 (i.e. 201 - 51).
Your task is to arrange the list in ascending order according to the goal difference between the teams: the team with the worst (i.e. lowest) goal difference comes first in the list and the best team comes last.
Note! You can either use a lambda statement or write your own value function. This does not affect the scoring.
'''
#########################
# approach 1
def sortby_goalsdiff(teams: list):
def get_goal_difference(team):
goals_for, goals_against = map(int, team[1].split(' - '))
return goals_for - goals_against
return sorted(teams, key=get_goal_difference)
# Example1:
teams = [
('Kalpa', '53 - 58')
,('Saipa', '144 - 21')
,('Tappara', '37 - 17')
,('Ilves', '16 - 121')
,('HIFK', '124 - 121')
,('Pelicans', '86 - 49')
,('Sport', '180 - 48')
,('KooKoo', '35 - 87')
,('HPK', '130 - 52')
,('Kärpät', '58 - 15')
,('Jukurit', '34 - 133')
,('Lukko', '195 - 10')
,('JYP', '107 - 45')
,('Ässät', '98 - 170')
,('TPS', '197 - 109')
]
print(sortby_goalsdiff(teams))
[('Ilves', '16 - 121'), ('Jukurit', '34 - 133'), ('Ässät', '98 - 170'), ('KooKoo', '35 - 87'), ('Kalpa', '53 - 58'), ('HIFK', '124 - 121'), ('Tappara', '37 - 17'), ('Pelicans', '86 - 49'), ('Kärpät', '58 - 15'), ('JYP', '107 - 45'), ('HPK', '130 - 52'), ('TPS', '197 - 109'), ('Saipa', '144 - 21'), ('Sport', '180 - 48'), ('Lukko', '195 - 10')]
# Example2
# Autograder input
# Original order:
('Ilves', '26 - 110')
('HPK', '32 - 74')
('KooKoo', '137 - 27')
('Ässät', '64 - 77')
('Tappara', '23 - 28')
('HIFK', '135 - 27')
('Saipa', '157 - 15')
('JYP', '28 - 75')
('Jukurit', '136 - 159')
('Kalpa', '11 - 53')
('Kärpät', '35 - 193')
('TPS', '86 - 137')
('Pelicans', '120 - 45')
('Sport', '26 - 165')
('Lukko', '119 - 192')
# Expected output
# Sorted by the goal difference:
('Kärpät', '35 - 193')
('Sport', '26 - 165')
('Ilves', '26 - 110')
('Lukko', '119 - 192')
('TPS', '86 - 137')
('JYP', '28 - 75')
('HPK', '32 - 74')
('Kalpa', '11 - 53')
('Jukurit', '136 - 159')
('Ässät', '64 - 77')
('Tappara', '23 - 28')
('Pelicans', '120 - 45')
('HIFK', '135 - 27')
('KooKoo', '137 - 27')
('Saipa', '157 - 15')
# Actual output by my python Terminal
teams = [
('Ilves', '26 - 110')
,('HPK', '32 - 74')
,('KooKoo', '137 - 27')
,('Ässät', '64 - 77')
,('Tappara', '23 - 28')
,('HIFK', '135 - 27')
,('Saipa', '157 - 15')
,('JYP', '28 - 75')
,('Jukurit', '136 - 159')
,('Kalpa', '11 - 53')
,('Kärpät', '35 - 193')
,('TPS', '86 - 137')
,('Pelicans', '120 - 45')
,('Sport', '26 - 165')
,('Lukko', '119 - 192')
]
print(sortby_goalsdiff(teams))
[('Kärpät', '35 - 193'), ('Sport', '26 - 165'), ('Ilves', '26 - 110'), ('Lukko', '119 - 192'), ('TPS', '86 - 137'), ('JYP', '28 - 75'), ('HPK', '32 - 74'), ('Kalpa', '11 - 53'), ('Jukurit', '136 - 159'), ('Ässät', '64 - 77'), ('Tappara', '23 - 28'), ('Pelicans', '120 - 45'), ('HIFK', '135 - 27'), ('KooKoo', '137 - 27'), ('Saipa', '157 - 15')]
# Actual output which autograder got - not sure why autograder didnt work
# Sorted by the goal difference:
('Ilves', '26 - 110')
('HPK', '32 - 74')
('KooKoo', '137 - 27')
('Ässät', '64 - 77')
('Tappara', '23 - 28')
('HIFK', '135 - 27')
('Saipa', '157 - 15')
('JYP', '28 - 75')
('Jukurit', '136 - 159')
('Kalpa', '11 - 53')
('Kärpät', '35 - 193')
('TPS', '86 - 137')
('Pelicans', '120 - 45')
('Sport', '26 - 165')
('Lukko', '119 - 192')
############################
# approach 2
def sortby_goalsdiff(teams: list) -> list:
"""
Sort teams based on their goal difference in ascending order.
Parameters:
teams: List of tuples, where each tuple contains:
(team_name: str, goals_for - goals_against: str)
Returns:
List of team tuples sorted by their goal difference in ascending order.
"""
# Define a helper function to calculate goal difference
def get_goal_difference(team):
goals_for, goals_against = map(int, team[1].split(' - '))
return goals_for - goals_against
# Sort the teams list INPLACE using the goal difference as the key
teams.sort(key=get_goal_difference)
# Return the sorted list
return teams
Original order:
('Kalpa', '123 - 61')
('Pelicans', '99 - 151')
('Tappara', '29 - 46')
('Ilves', '179 - 56')
('Jukurit', '32 - 60')
('JYP', '108 - 112')
('Lukko', '147 - 115')
('Ässät', '37 - 35')
('Kärpät', '179 - 165')
('Saipa', '78 - 102')
('TPS', '197 - 164')
('KooKoo', '89 - 132')
('HIFK', '48 - 136')
('HPK', '164 - 175')
('Sport', '168 - 153')
Sorted by the goal difference:
('HIFK', '48 - 136')
('Pelicans', '99 - 151')
('KooKoo', '89 - 132')
('Jukurit', '32 - 60')
('Saipa', '78 - 102')
('Tappara', '29 - 46')
('HPK', '164 - 175')
('JYP', '108 - 112')
('Ässät', '37 - 35')
('Kärpät', '179 - 165')
('Sport', '168 - 153')
('Lukko', '147 - 115')
('TPS', '197 - 164')
('Kalpa', '123 - 61')
('Ilves', '179 - 56')