5

age と room_number 属性を持つ Person オブジェクトのリストがあり、 person.age() と person.room_number() が満足できる場合は True を返し、そうでない場合は False を返す check() 関数を作成したとします。

filter(check, list_of_people_objects)の基準を満たす Person オブジェクトのリストを返します。check()

ただし、私の質問は、リスト内包表記を使用せずに、リストを 2 回繰り返すことなく、承認された各人の部屋番号のリストを返す方法はありますか? フィルタリングしますが、イテラブルのより具体的な属性を返します。

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

4

3 に答える 3

14

実際には2つの方法があります。

  1. itertools

    map(..., itertools.ifilter(..))
    
  2. リスト内包表記

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

どちらを選択するかは好みの問題ですが、慣習は後者に傾いています。

于 2012-08-15T09:33:36.840 に答える
1

プロパティのサブセットの包括的和集合を実行して制限された値のセットに等しくし、フィルター処理されたリストの任意のオプション (属性値のリストを含む) を実行するオブジェクト フィルター処理の場合、ジェネレーターを使用して次のことができます。単一のステートメント (コードの最後の行、残りは、コンストラクターのパラメーターを生成するために行列乗算を使用してオブジェクトの大きなリストを生成することを示す命令です)

#!/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)))
于 2016-01-29T21:53:33.467 に答える
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>]
于 2012-08-15T09:43:21.613 に答える