una tuplas recorrer por llenar listas lista diccionarios conjuntos comprensión anidadas python list count nested

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}