2016-10-19 64 views
1

我想知道誰是對象列表中較高的運動員(對象)。如果我想打印出來,我試着寫:有沒有辦法引用列表中的對象的兩個屬性?

print ("The greater height is",max(x.height for x in athletes_list),"meters.") 

它顯示了較高的運動員的身高,但我不知道如何通過這種方式來獲得自己的名字,把所有的命令在打印的身體。有沒有辦法做到這一點?

我知道它可以通過像這樣創建:

for i in athletes_list: 
    if i.height==max(x.height for x in athletes_list): 
     print ("The taller athlete is",i.name,"with",i.height,"meters.") 

是否有可能僅在打印的身體得到兩個信息? 對不起,英語不好。

+1

如果有超過一名運動員身高最高,該怎麼辦? – thefourtheye

+0

您正在尋找argmax。在Python中,你這樣做的方式是'max(iterable,key = lambda x:...)' – michaelsnowden

+0

好點,@thefourtheye。我會嘗試自己找到解決方案,使用我在這裏找到的答案和一些邏輯。但如果有人想要給出一個方法,那會很好;) –

回答

2

重讀您的問題。答案仍然是。使用字符串的format方法:

print("The taller athlete is {0.name} with {0.height} meters.".format(max(athletes_list, key=lambda a: a.height))) 
+0

乾淨利落的工作。 :-)上調。 – ShadowRanger

+0

是的,他也可以對列表進行排序:'athletes_list.sort(key = lambda a:a.height,reverse = True)',並得到第一名運動員。 –

+1

@LaurentLAPORTE:當然,如果他只想要第一個,那麼'sort'的成本是'O(n log n)','max'是'O(n)',所以它只有在他實際上需要他們全部排序。 – ShadowRanger

1

使用max超過兩個值(帶高度在前):

from future_builtins import map # Only on Py2, to get generator based map 
from operator import attrgetter 

# Ties on height will go to first name alphabetically 
maxheight, name = max(map(attrgetter('height', 'name'), athletes)) 
print("The taller athlete is", name, "with", maxheight, "meters.") 

還是讓關係得到解決的出場順序,而不是名稱:

maxheight, name = attrgetter('height', 'name')(max(athletes, key=attrgetter('height'))) 
+0

大多數開發人員不太瞭解'attrgetter',我更喜歡在其他答案中使用'lambda'和'max()'。 –

+0

@LaurentLAPORTE:大多數開發人員都不會正確使用'map'(如果您將它與'lambda'一起使用,那麼您就是在悲觀化,而應該只是使用listcomp或genexpr)。我_prefer_'attrgetter'和'itemgetter',因爲它們是自我記錄和信號「沒有技巧在這裏」。它們也更快,並且很好地一次性獲得許多值。當有技巧時(例如'lambda x:x [0],-x [2],x [1]'的排序鍵,請注意'x [2]'上的'-'')使'itemgetter(0,2,1)'不可用),所以當我在代碼中看到'lambda'時,我知道要更仔細地檢查。不過值得一試。 – ShadowRanger

+0

不錯的一個。像魅力一樣工作,但我認爲這種方式比現在使用max()的lamba更復雜一些。 –

相關問題