我想按属性、类型或其他条件缩小列表元素的列表。
类似的东西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
只是一个具有两个属性的类: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]