在要在其中做屬性的子集的一個包容工會爲等於一組有限值中,然後執行任何選擇對象濾波的情況下(包括過濾列表,你可以做的列表中選擇屬性值)在一個聲明(代碼最後一行用發電機之後,剩下的就是那裏的指令顯示生成的對象使用矩陣乘法來生成構造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)))
謝謝,使用ifilter和過濾器有什麼區別嗎?我知道列表理解將會起作用(正如問題中指定的那樣),但是希望使用itertools/map/filter的一個聰明方法,它只使用一次迭代D: – zhuyxn 2012-08-15 09:41:53
'ifilter()'返回一個生成器而不是一個序列,所以在迭代完成之前沒有任何內容被檢查。 – 2012-08-15 09:49:08