2012-03-25 14 views
5

Così ho queste liste:Ricerca di valori minimi, massimi e medi per gli elenchi annidati?

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] 

Il formato è [nome del giocatore, prima partitura turno, secondo punteggio rotondo]

Come scrivere un codice per trovare il valore più alto, così come la media per il primo e il secondo punteggio rispettivamente?

EDIT: Penso che potrei aver bisogno di stampare il 'nome dei giocatori con il punteggio più alto' al posto del 'punteggio più alto', ma non so come fare: \

+4

solo dicendo, ma potrebbe essere il momento di scrivere una classe 'Player'. –

+0

Cosa succede se c'è un punteggio più alto legato ...? – fraxel

+1

... o almeno una tupla, è concettualmente più adatta di una lista. – tokland

risposta

9

Valore massimo:

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

valore più basso:

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

Medie per ogni giocatore ::

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

ETA: Per il tuo commento, il nome del giocatore con il punteggio più alto:

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

Si potrebbe semplicemente chiamare 'max (max (p [1:]) per p in PlayerList)'. – kennytm

+0

Vero e come un generatore che sarebbe (leggermente) più veloce –

+0

@KennyTM Esiste un modo per stampare il nome del giocatore che ha anche il punteggio più alto? – DarsAE

1

Max e min:

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

media è un po 'più sporco:

>>> [(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

Per trovare i giocatori con il punteggio più alto e più basso in qualsiasi round:

(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) 

Se invece si desidera che i giocatori con il punteggio totale più alto e più basso, è sufficiente sostituire max(a, b) e min(a, b) con a + b.

Si noti che questo sceglie un singolo miglior/peggior giocatore, anche se c'è un pareggio.

Per trovare medie di primo e del secondo punteggi:

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