リストの要素のリストを、属性、タイプ、またはその他の条件で絞り込みたい。
のようなものelements.only_type(Flower).get_nearest_to(player)
は、よりもはるかに見栄えがしmin(filter(lambda i: isinstance(i, Flower), elements), lambda i: i.pos.distance_to(player.pos)
ます。
次のことは、効率、クリーンなコード、および単純さの観点から良い考えですか?それとも、これに適した方法、実装、またはデザインパターンはすでにありますか?
class Selector(object):
def __init__(self, selection):
self.s3l3ct1on = selection
def __getattr__(self, name):
return type(self)(getattr(el, name) for el in self.s3l3ct1on)
def __iter__(self):
return iter(self.s3l3ct1on)
def filter(self, function):
return type(self)(filter(function, self.s3l3ct1on))
そして、これはそれがどのように使われることができるかA
です:(は2つの属性を持つ単なるクラスです:a
とb
)
>>> sel = [A(3, 4), A(0, 9), A('test', 3), A(4,22), A(3, 9)]
>>> Selector(sel)
<__main__.Selector object at 0x13b0a90>
>>> list(Selector(sel))
[<__main__.A object at 0x13b0fd0>,
<__main__.A object at 0x13b0b50>,
<__main__.A object at 0x13b0150>,
<__main__.A object at 0x13b0710>,
<__main__.A object at 0x13b06d0>]
>>> set(Selector(sel).a)
{0, 'test', 3, 4}
>>> list(Selector(sel).b)
[4, 9, 3, 22, 9]
>>> s = Selector(sel).b.filter(lambda i: i%2 == 0)
>>> list(s)
[4, 22]