python - tuplas - Contando cuántas veces los equipos de fútbol han ganado usando una lista anidada
recorrer listas anidadas python (4)
Necesito escribir una función que mire una lista anidada con dos equipos y su puntaje del juego respectivamente. La lista contiene varias coincidencias y quiero que la salida sea una lista anidada con todos los nombres de equipo y cuántos juegos ganaron. La lista se ve así:
L = [[''Patriots'', ''Giants'', ''3'', ''1''], [''Steelers'', ''Patriots'', ''1'', 2''], [''Giants'', ''Steelers'', ''3'', ''5'']]
Entonces, en la lista de arriba, los primeros dos elementos son los nombres de los equipos y los elementos tercero y cuarto son los puntos que anotan en el partido. Sin embargo, la lista es mucho más grande que esto y hay muchos más equipos. La salida se vería así:
finalList = [[''Patriots'', 2], [''Giants'', 0], [''Steelers'', 1]]
porque los Patriots ganaron dos juegos, los Gigantes ganaron cero juegos y los Steelers ganaron un juego.
He intentado con el siguiente código, pero no funciona y estoy atascado.
def gamesWon():
for i in L:
count = 0
if i[2]>i[3]:
count += 1
i.append(count)
Alternativamente, puede usar un Counter
, que es parecido a un dictado:
import collections as ct
L = [
[''Patriots'', ''Giants'', ''3'', ''1''],
[''Steelers'', ''Patriots'', ''1'', ''2''],
[''Giants'', ''Steelers'', ''3'', ''5''],
[''Giants'', ''Patriots'', ''1'', ''1''] # tie
]
def count_wins(games):
"""Return a counter of team wins, given a list of games."""
c = ct.Counter()
for team1, team2, s1, s2 in games:
c[team1] += 0
c[team2] += 0
if int(s1) == int(s2):
continue
elif int(s1) > int(s2):
c[team1] += 1
else:
c[team2] += 1
return c
season = count_wins(L)
season
# Counter({''Giants'': 0, ''Patriots'': 2, ''Steelers'': 1})
El último código da un valor predeterminado de incrementos de cero para nuevas entradas y maneja vínculos:
L_tie = [[''Cowboys'', ''Packers'', ''3'', ''3'']]
game = count_wins(L_tie)
game
# Counter({''Cowboys'': 0, ''Packers'': 0})
Los contadores tienen algunos métodos útiles para encontrar los mejores equipos:
season.most_common(2)
# [(''Patriots'', 2), (''Steelers'', 1)]
Los mostradores son flexibles. Puedes actualizar Contadores fácilmente:
season.update(game)
season
# Counter({''Cowboys'': 0, ''Giants'': 0, ''Packers'': 0, ''Patriots'': 2, ''Steelers'': 1})
También puede agregar (restar y realizar operaciones de conjunto con) otros Contadores:
L_last = [[''49ers'', ''Raiders'', ''7'', ''10''], [''Packers'', ''Patriots'', ''3'', ''7'']]
last_season = count_wins(L_last)
season + last_season
# Counter({''Patriots'': 3, ''Raiders'': 1, ''Steelers'': 1})
ACTUALIZACIÓN: vea también esta respuesta relacionada para una variante de expresión del Counter
/ generador.
Puedes usar defaultdict
from collections import defaultdict
L = [[''Patriots'', ''Giants'', ''3'', ''1''], [''Steelers'', ''Patriots'', ''1'', ''2''], [''Giants'', ''Steelers'', ''3'', ''5'']]
D = defaultdict(int)
for match in L:
team1, team2, score1, score2 = match
D[team1] # make sure the team exist in the dict even if it never wins a match
D[team2] # make sure the team exist in the dict even if it never wins a match
if int(score1) > int(score2):
D[team1] += 1
if int(score2) > int(score1):
D[team2] += 1
A continuación, puede convertir D
en una lista fácilmente si lo necesita ...
Puedes usar un defaultdict
:
from collections import defaultdict
# initialize the result as a defaultdict with default value of 0
result = defaultdict(lambda : 0)
for t1,t2,s1,s2 in L:
if int(s1) > int(s2):
result[t1] += 1
elif int(s2) > int(s1):
result[t2] += 1
result
# defaultdict(<function __main__.<lambda>>, {''Patriots'': 2, ''Steelers'': 1})
Tenga en cuenta que, aunque en el resultado, faltan equipos con puntaje cero, pero si llama result[team]
, le da cero.
ll = [[''Patriots'', ''Giants'', ''3'', ''1''], [''Steelers'', ''Patriots'', ''1'', ''2''], [''Giants'', ''Steelers'', ''3'', ''5'']]
teamStatus = {}
for l in ll:
team1,team2,team1_score,team2_score = l
if team1 not in teamStatus:
teamStatus[team1] = 0
if team2 not in teamStatus:
teamStatus[team2] = 0
if int(team1_score) > int(team2_score):
teamStatus[team1] += 1
else:
teamStatus[team2] += 1
print(teamStatus)
RESULTADO
{''Patriots'': 2, ''Giants'': 0, ''Steelers'': 1}