2016-10-19 4 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를 찾고 있습니다. 파이썬에서, 당신이하는 방법은'max (iterable, key = lambda x : ...)'입니다. – michaelsnowden

+0

좋은 지적, @thefourtheye. 나는 여기서 찾은 대답과 약간의 논리를 사용하여 그 해결책을 스스로 얻으려고 노력할 것이다. 그러나 만약 누군가가 길을주고 싶다면 그것은 좋을 것이다;) –

답변

2

질문하기. 대답은 여전히 ​​예입니다.

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

한 줄로 묶는 일은 훌륭하다. :-) Up-voted. – ShadowRanger

+0

네, 그는 또한리스트를 정렬 할 수 있습니다 :'athletes_list.sort (key = lambda a : a.height, reverse = True)'그리고 첫 번째 운동 선수를 얻으십시오. –

+1

@LaurentLAPORTE : 물론, 그가 첫 번째만을 원한다면'sort '의 비용은'O (n log n)'과'max'를위한'O (n)'입니다. 그는 실제로 그들을 모두 정렬해야합니다. – ShadowRanger

1

(제 1 높이와) 두 값 이상 max를 사용 : 문자열의 format 방법을 사용하여 외관의 명령으로

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'를 정말로 이해하지 못합니다. 나는 다른 답처럼'max()'와 함께'lambda '를 사용하는 것을 선호합니다. –

+0

@LaurentLAPORTE : 대부분의 개발자는'map'을 올바르게 사용하지 않습니다 ('lambda '와 함께 사용하면 비관적이며 대신 listcomp 또는 genexpr을 사용해야합니다). 나는 스스로 문서화하고 "여기에 속임수를 알리지"않기 때문에 "attrgetter"와 "itemgetter"를 선호한다. 그것들은 또한 더 빠르며 한 번에 많은 값을 얻을 수있게 훌륭하게 확장됩니다. 트릭 (예 :'lambda x : x [0], -x [2], x [1]'의 정렬 키, 'x [2]'에'-'를 적어 둡니다. 'itemgetter (0, 2, 1)'을 사용할 수 없게 만든다.) 그래서 코드에서'lambda's를 볼 때 좀 더주의 깊게 체크해야한다. 하지만 downvote 가치가 없습니다. – ShadowRanger

+0

좋은 친구. 매력처럼 작동하지만이 방법은 지금 max()가있는 lamba보다 약간 복잡하다고 생각합니다. –

관련 문제