2014-04-11 2 views
0

나는이 문구를 어떻게 표현할 지 잘 모르겠습니다. 오해의 소지가 있거나 중복되는 경우 미안합니다. 그것은 간단하다 내가 이러한 개체 중 하나가 가지고있는 대부분의 사과를 찾으려면개체가 일부 기준을 충족하는 개체 목록에서 개체를 검색하는 올바른 방법

class MyClass(object): 
    def __init__(self, num_apples): 
     self.apples = num_apples 

a = MyClass(1) 
b = MyClass(3) 
c = MyClass(2) 

:

group = [a, b, c] 
most_apples = max([g.apples for g in group]) # == 3 

하지만 무엇을 내가 원하는 경우

내가 클래스가 있다고 가정하자 3 대신 3 사과가있는 개체를 검색 할 수 있습니까? 나는 다음과 같이 할 수있다 :

has_most_apples = [g for g in group if g.apples == most_apples][0] # == b 

내 질문은 이렇다. 좀 더 우아하고 파이썬적인 방법이 있는가?

사실 이제이 글을 작성 했으므로 그렇게 나쁘지 않습니다. 그래도 질문은 여전히 ​​유효합니다. 나는 :) 궁금

답변

1

max 함수는 key 인수를 사용하여 최대 값을 계산하는 방법을 결정합니다. max(group, key=lambda x: x.apples)을 사용하면 apples 값이 가장 큰 개체를 가져올 수 있습니다.

+0

브릴리언트, 나는 핵심 논쟁에 대해 몰랐다. 작은 설명도 주셔서 감사합니다. – moarCoffee

2

다시 읽는 여러 사과가 있다면, 당신은 필터 기능으로 확장 할 수 있습니다, 귀하의 질문에 - 당신은 당신의 자신을 구현할 수

>>> target_value = 3 
>>> a = MyClass(1) 
>>> b = MyClass(3) 
>>> c = MyClass(2) 
>>> d = MyClass(3) 
>>> group = [a,b,c,d] 
>>> new_group = filter(lambda x : x.apples==target_value,group) 
>>> new_group[0] is b 
True 
>>> new_group[1] is d 
True 

그것을 읽을 수 있도록하려면 함수

>>> def get_apples(num_apples): 
     return lambda x : x.apples==num_apples 
>>> new_group = filter(get_apples(3),group) 
0

다른 답변은 좋습니다. 그러나 코드

has_most_apples = [g for g in group if g.apples == most_apples][0] 

는 사과의 가장 높은 번호가 첫 번째 요소를 반환합니다 기억 해요. 그렇게 할 수있는 비난이 둘 이상있을 수 있습니다.

0

apples 속성에서 목록을 정렬 한 다음 첫 번째 요소를 사용할 수 있습니다.

from operator import attrgetter 

a = MyClass(1) 
b = MyClass(3) 
c = MyClass(2) 

group = [a, b, c] 

has_most_apples = sorted(group, key=attrgetter('apples'), reverse=True)[0] 

이, 물론, TDK는에만 사과 같은 수의 여러가있는 경우에도 하나 개의 요소를 반환하는 언급하는 것과 같은 경고가 있습니다.

관련 문제