2012-08-15 90 views
3

假設我有Person對象,其中有一個年齡和room_number屬性的列表,我已經寫了檢查()函數,該函數返回True,如果person.age()和person.room_number()是令人滿意的,否則返回False 。Python,過濾一個對象列表,但返回一個特定的屬性?

filter(check, list_of_people_objects)將返回Person對象的列表,它滿足check()

的標準然而,我的問題是,是否有返回每個批准人的房間號的列表,而無需通過列表迭代的方式兩次,像所以沒有使用列表理解? 因此過濾,但返回可迭代的更具體的屬性。

map(lambda x: x.room_number(), filter(check, list_of_people_objects))

回答

10

其實有方式。

  1. itertools

    map(..., itertools.ifilter(..)) 
    
  2. 列表理解

    [x.room_number() for x in people if check(x)] 
    

你的選擇主要是口味的問題,但會議對後者傾斜。

+0

謝謝,使用ifilter和過濾器有什麼區別嗎?我知道列表理解將會起作用(正如問題中指定的那樣),但是希望使用itertools/map/filter的一個聰明方法,它只使用一次迭代D: – zhuyxn 2012-08-15 09:41:53

+1

'ifilter()'返回一個生成器而不是一個序列,所以在迭代完成之前沒有任何內容被檢查。 – 2012-08-15 09:49:08

0
class Person(): 
    def __init__(self,age,room): 
     self.age=age 
     self.room=room 
    def check(self) : 
     if self.room>300 and self.age>15: 
      return True 
     else: 
      return False 

輸出:

>>> a=Person(20,285) 
>>> b=Person(22,990) 
>>> c=Person(12,958) 
>>> d=Person(18,150) 
>>> room=[] 
>>> filterd=[] 
>>> for x in (a,b,c,d): 
    if x.check(): 
     room.append(x.room) 
     filterd.append(x) 


>>> room 
[990] 
>>> filterd 
[<__main__.Person object at 0xa94c94c>] 
1

在要在其中做屬性的子集的一個包容工會爲等於一組有限值中,然後執行任何選擇對象濾波的情況下(包括過濾列表,你可以做的列表中選擇屬性值)在一個聲明(代碼最後一行用發電機之後,剩下的就是那裏的指令顯示生成的對象使用矩陣乘法來生成構造PARAMS)的大名單

#!/usr/bin/env python 
import itertools 
import pprint 
class myObj(object): 
    attr_1 = None 
    attr_2 = None 
    attr_3 = None 
    def __init__(self, at1, at2, at3): 
     self.attr_1 = at1 
     self.attr_2 = at2 
     self.attr_3 = at3 
     super(myObj, self).__init__() 

    def __repr__(self): 
     return '<%s %s>' % (type(self), pprint.pformat(self.__dict__)) 

objs = itertools.starmap(myObj, itertools.product(iter('val_%d' % (i) for i in 
    range(1,4)), repeat=3)) 

filter_dict = { 
    'attr_1' : 'val_1', 
    'attr_2' : 'val_2', 
    'attr_3' : 'val_3', 
} 
print(list(result.attr_3 for result in objs if not list(False for pn,cval in 
    filter_dict.items() if getattr(result, pn, None) != cval))) 
相關問題