I need to return the name of the best team from several teams inserted in a dictionary taking into account the number of points ("wins"*3 "draws") and if there are two teams tied I want to return the one with the best goal difference ("scored" - "conceded") I tried to do it like that but te function returned Barcelona instead of Real Madrid.
def football_league(teams):
best_team = max(teams, key=lambda k: k["wins"]*3 k["draws"])
if len(best_team)>1:
best_team = max(teams, key=lambda k: k["scored"] - k["conceded"])
return best_team["name"]
else:
return best_team["name"]
la_liga = [
{
"name": "Sevilha",
"wins": 18,
"loss": 10,
"draws": 10,
"scored": 60,
"conceded": 10,
},
{
"name": "Barcelona",
"wins": 22,
"loss": 8,
"draws": 8,
"scored": 88,
"conceded": 20,
},
{
"name": "Real Madrid",
"wins": 22,
"loss": 8,
"draws": 8,
"scored": 98,
"conceded": 29,
},
{
"name": "Atletico Madrid",
"wins": 22,
"loss": 8,
"draws": 8,
"scored": 90,
"conceded": 30,
}
]
print(football_league(la_liga))
CodePudding user response:
max()
will not return an array of teams, just a single result. What you need is sorting the list according to a tuple of quantities (points, goal_difference)
. The following code:
la_liga = [
{
"name": "Sevilha",
"wins": 18,
"loss": 10,
"draws": 10,
"scored": 60,
"conceded": 10,
},
{
"name": "Barcelona",
"wins": 22,
"loss": 8,
"draws": 8,
"scored": 88,
"conceded": 20,
},
{
"name": "Real Madrid",
"wins": 22,
"loss": 8,
"draws": 8,
"scored": 98,
"conceded": 29,
},
{
"name": "Atletico Madrid",
"wins": 22,
"loss": 8,
"draws": 8,
"scored": 90,
"conceded": 30,
}
]
print(sorted(la_liga, key= lambda t: (t["wins"]*3 t["draws"],
t["scored"] - t["conceded"]), reverse= True)[0])
will return the true best team:
{'name': 'Real Madrid', 'wins': 22, 'loss': 8, 'draws': 8, 'scored': 98, 'conceded': 29}
(Although, as a Spaniard, I would prefer some other team to win ;-) )