2012-03-25 12 views
5

Więc mam tych list:Znajdowanie wartości minimalnych, maksymalnych i średnich dla list zagnieżdżonych?

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] 

format jest [nazwa gracza, pierwsza runda wynik, druga runda wynik]

Jak napisać kod, aby znaleźć najwyższą wartość, a także średnią odpowiednio dla pierwszego i drugiego wyniku?

EDIT: Myślę, że muszę wydrukować „nazwy graczy z najwyższym wynikiem” zamiast „” najwyższy wynik, ale nie wiem jak to zrobić: \

+4

tylko powiedzieć, ale może to być czas, aby napisać klasę 'Player'. –

+0

Co się stanie, jeśli jest związany najwyższy wynik ...? – fraxel

+1

... lub przynajmniej krotka, to koncepcyjnie bardziej pasująca niż lista. – tokland

Odpowiedz

9

Najwyższa wartość:

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

Najniższa wartość:

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

Średnie dla każdego gracza ::

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

ETA: Per Twojego komentarza, nazwa gracza z najwyższym wynikiem:

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

Możesz po prostu wywołać 'max (max (p [1:]) dla p w PlayerList)'. – kennytm

+0

To prawda, i jako generator, który byłby (nieco) szybszy –

+0

@KennyTM Czy mogę wydrukować imię gracza, który ma najwyższy wynik? – DarsAE

1

Max i min:

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

średnia jest nieco brudniejsze:

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

Aby znaleźć graczy z najwyższym i najniższym wynikiem w dowolnej rundzie:

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

Jeśli zamiast tego chcesz graczy z najwyższymi i najniższymi wynikami, po prostu zamień max(a, b) i min(a, b) na a + b.

Należy zauważyć, że wybiera on jednego najlepszego/najgorszego gracza, nawet jeśli jest remis.

Aby znaleźć średnie pierwszych i drugich punktów:

avg_round1 = float(sum(a for (_, a, _) in players))/len(players) 
avg_round2 = float(sum(b for (_, _, b) in players))/len(players) 
Powiązane problemy