2012-03-25 134 views
5

所以我有这些列表:查找嵌套列表的最小值,最大值和平均值?

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] 

格式为[玩家的名字,第一轮成绩,第二轮成绩]

如何编写代码,找出最高值,以及平均分别获得第一和第二分数?

编辑:我想我可能需要“得分最高的球员的名字”打印,而不是“最高分”,但我不知道该怎么做:\

+4

只是说,但它可能是时间来写一个'Player'类。 – 2012-03-25 08:49:45

+0

如果最高得分相同......? – fraxel 2012-03-25 09:42:46

+1

...或者至少是一个元组,它在概念上比列表更合适。 – tokland 2012-03-25 09:42:59

回答

9

最高值:

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

最低值:

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

平均值为每个玩家::

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

ETA:按照您的评论,得分最高的球员的名字:

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

你可以在PlayerList中调用'max(max(p [1:])p')。 – kennytm 2012-03-25 08:21:14

+0

确实如此,并且作为一个稍微快一点的发生器 – 2012-03-25 08:22:59

+0

@KennyTM有没有什么方法可以打印得分最高的玩家的名字? – DarsAE 2012-03-25 08:41:23

1

最大值和最小值:

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

平均是有点脏:

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

要找到任何一轮中得分最高和最低的球员:

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

如果您希望获得总分最高和最低的选手,只需将max(a, b)min(a, b)替换为a + b即可。

请注意,即使有领带,这也会选出一个最佳/最差的选手。

要找到第一和第二分数的平均值:

avg_round1 = float(sum(a for (_, a, _) in players))/len(players) 
avg_round2 = float(sum(b for (_, _, b) in players))/len(players) 
相关问题