2013-07-30 2 views
0

나는 MC의 인스턴스리스트를 가지고 있고, 속성이 2 인 모든 인스턴스의 서브 세트를 만들고 싶다. "superfunction"함수를 만드는 것을 도울 수 있는가? 받아들이거나 거부 할 값.Python : 속성에 따라리스트 서브 세트하기

class MC(object): 
    def __init__(self,smth): 
     self.smth=smth 

l = [MC(2),MC(4),MC(1),MC(2),MC(2),MC(-3),MC(0)] 

def superfunction (a_list,attr,value_to_accept=None, value_to_reject=None): 
    return a_subset 

사전은 어떻게 작동합니까?

고맙습니다.

특정 예를 들어

답변

1

, 당신과 같이 지능형리스트를 사용할 수 있습니다

if value_to_accept is not None: 
    return [x for x in a_list if x.smth == value_to_accept] 
if value_to_reject is not None: 
    return [x for x in a_list if x.smth != value_to_reject] 
return [] 
1

당신은 반드시 필요하지 않습니다

return [x for x in a_list if x.smth == 2] 

당신의 일반적인 예를 들어, 비슷한 일을 할 수 이것을 수행하는 별도의 함수. 당신은 술어 filter()을 사용할 수

[mc from l if mc.smth == value_to_accept] 
[mc from l if mc.smth != value_to_reject] 
1

: 지능형리스트는 매우 간단하다

def superfunction (a_list, attr, value_to_accept=None, value_to_reject=None): 
    def predicate(item): 
     value = getattr(item, attr) 
     if value_to_reject is not None and value != value_to_reject: 
      return False 
     if value_to_accept is not None and value == value_to_accept: 
      return True 
     return False 

    return filter(predicate, a_list) 

이하자 수락하거나 거부 할 값 중 하나를 지정합니다.

보통

그러나, 대신 함수의 인라인 지능형리스트를 사용하십시오 :

[elem for elem in a_list if a_list.attr == value_to_accept] 
관련 문제