2014-04-11 39 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 

所以我的問題是:是否有一個更優雅/ Python的方式做到這一點?

其實現在我已經寫了這個,它似乎並不壞。問題仍然存在。我很好奇:)

回答

1

max函數需要一個key參數來決定如何計算最大值。您可以使用max(group, key=lambda x: x.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

您可以根據​​屬性對列表進行排序,然後取第一個元素。

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的僅返回即使存在多個具有相同數量的蘋果一個元件提到。