2012-03-25 13 views
5

Así que tienen estas listas:¿Encontrar valores mínimos, máximos y promedio para listas anidadas?

Player1 = ["Ryan", 24, 19] 
Player2 = ["Jamie", 22, 24] 
Player3 = ["Alicia", 17, 15] 
Player4 = ["Dominique", 13, 11] 
Player5 = ["Michael", 18, 23] 

PlayerList = [Player1, Player2, Player3, Player4, Player5] 

El formato es [nombre del jugador, primera puntuación ronda, segunda puntuación redonda]

Cómo escribir un código para encontrar el valor más alto, así como el promedio para el primer y segundo puntaje, respectivamente?

EDIT: Creo que puede ser que necesite para imprimir el nombre de los jugadores con la puntuación más alta 'en lugar del 'puntuación más alta', pero no sé cómo hacer eso: \

+4

sólo decir, pero podría ser el momento de escribir una clase 'Player'. –

+0

¿Qué pasa si hay un puntaje más alto empatado ...? – fraxel

+1

... o al menos una tupla, es conceptualmente más adecuada que una lista. – tokland

Respuesta

9

valor más alto:

max(max(p[1:]) for p in PlayerList) 

valor más bajo:

min(min(p[1:]) for p in PlayerList) 

promedios para cada jugador ::

[float(p[1] + p[2])/2 for p in PlayerList] 

ETA: por su comentario, el nombre del jugador con la puntuación más alta:

max(PlayerList, key=lambda p: max(p[1:]))[0] 
+0

Podrías simplemente llamar a 'max (max (p [1:]) para p en PlayerList)'. – kennytm

+0

Cierto, y como un generador que sería (ligeramente) más rápido –

+0

@KennyTM ¿Hay alguna manera de que pueda imprimir el nombre del jugador que tiene el puntaje más alto también? – DarsAE

1

Max y Min:

>>> max(PlayerList, key=lambda p: max(p[1:])) 
['Ryan', 24, 19] 
>>> min(PlayerList, key=lambda p: min(p[1:])) 
['Dominique', 13, 11] 

promedio es un poco más sucio:

>>> [(p[0], sum(p[1:])/2.) for p in PlayerList] 
[('Ryan', 21.5), ('Jamie', 23.0), ('Alicia', 16.0), ('Dominique', 12.0), ('Michael', 20.5)] 
1

Para encontrar los jugadores con el puntaje más alto y más bajo en cualquier ronda:

(max_score, max_player) = max((max(a, b), player) for (player, a, b) in players) 
(min_score, min_player) = min((min(a, b), player) for (player, a, b) in players) 

Si en su lugar desea los jugadores con los puntajes totales más altos y más bajos, simplemente reemplace max(a, b) y min(a, b) con a + b.

Tenga en cuenta que esto elige un solo jugador mejor/peor, incluso si hay un empate.

Para hallar las medias de las puntuaciones primera y segunda:

avg_round1 = float(sum(a for (_, a, _) in players))/len(players) 
avg_round2 = float(sum(b for (_, _, b) in players))/len(players) 
Cuestiones relacionadas