2013-07-30 44 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

爲了您的具體的例子,你可以用一個列表理解像這樣:

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

爲了您一般的例子,你可以做類似的事情:

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

你不一定需要一個單獨的功能來做到這一點。 List內涵是非常簡單的:

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

你可以使用filter()與謂詞:

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] 
相關問題