gpt4 book ai didi

python - 通过属性或其他条件缩小元素列表范围的好方法是什么?

转载 作者:行者123 更新时间:2023-12-01 05:49:36 24 4
gpt4 key购买 nike

我想通过属性、类型或其他条件来缩小列表中元素的列表范围。

类似 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 只是一个具有两个属性的类:ab)

>>> 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]

最佳答案

您提到的每种选择过程都可以根据 itertools 迭代器来定义。以下形式化了这一点,并且可以轻松扩展以支持更多种类。使用它的语法看起来非常可读。

虽然我没有进行任何性能测试,但我希望结果具有竞争力,因为几乎所有涉及的开销都在构造函数方法中。唯一可能稍微快一点的事情就是用等效的 itertools 迭代器函数替换它的用法——所以如果您希望使用它,它似乎可能是一个有效的便利工具。进行大量此类处理。

import itertools

class Selector(object):
def __init__(self, iterable, **kwargs):
if not kwargs:
self.iterator = iterable
elif len(kwargs) > 1:
raise ValueError('only one selector type keyword allowed')
else:
selector, target = kwargs.items()[0]

if selector == 'by_attr':
self.iterator = itertools.imap(lambda obj: getattr(obj, target), iterable)
elif selector == 'by_type':
self.iterator = itertools.ifilter(lambda obj: isinstance(obj, target),
iterable)
elif selector == 'by_func':
self.iterator = itertools.ifilter(target, iterable)
else:
raise ValueError('unknown selector type keyword')

def __iter__(self):
return self.iterator


if __name__ == '__main__':
from selector import Selector

class A(object):
def __init__(self, a, b):
self.a, self.b = a, b

class Flower(object):
def __init__(self, name):
self.name = name

sel = [A(3, 4), A(0, 9), A('test', 3), A(4,22), A(3, 9)]
print list(Selector(sel, by_attr='a'))

sel = [42, Flower('Buttercup'), [1,2,3,5,8], A(20, 13), Flower('Rose')]
print list(Selector(sel, by_type=Flower))

sel = [4, 9, 3, 22, 9]
print list(Selector(sel, by_func=lambda i: i%2 == 0))

关于python - 通过属性或其他条件缩小元素列表范围的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14864684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com