基于各种类型和对象属性的匹配

2024-09-26 04:57:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个对象列表,我试图根据返回匹配列表的选定条件从中筛选对象。属性包括字符串、整数、浮点和对象。我遇到的问题是试图根据对象属性进行过滤,我想这样做:

findOrder(d, signal='CO', contract.symbol=1)

我不能简单地比较对象本身,因为我只需要根据最重要的属性进行匹配,并且不同对象的属性不同

到目前为止,我可以成功地将对象展平为dict,然后进行简单的字典比较。然而,这是非常丑陋的,我怀疑是缓慢的:

findOrder(d, signal='CO', contractSymbol=1)

class emptyObj(object):
    def __init__(self, a, b):
        self.Symbol = a
        self.Order = b
s = emptyObj(a=1, b=2)

class toObj(object):
    def __init__(self, d): [setattr(self, a, b) for a, b in d.items()]

def findOrder(d, **kwargs):
    def flatten(di):
        ls = []
        for o in di:
            e = {}
            for k, v in o.__dict__.items():
                if isinstance(v, (int, float, str, tuple, list, dict)):
                    e[k] = v
                else:
                    for attr, val in v.__dict__.items(): e[str(k)+str(attr)] = val
            ls.append(e)
        return ls

    g = flatten(d)
    l = [k for k in g if kwargs.items() <= k.items()]
    if l: return l

d = [toObj({'id':1250, 'signal': 'CO', 'contract': s}),
     toObj({'id':1252, 'signal': 'LO', 'contract': s})]

print(findOrder(d, signal='CO'))

有没有一种更为优化和直接的方法来实现这一点


Tags: 对象inselfforsignalif属性def
1条回答
网友
1楼 · 发布于 2024-09-26 04:57:24

如果试图按属性筛选对象,请使用filter或列表理解,并使用检查属性的函数:

def check_attrs(**kw):
    def wrapper(obj):
        return all(getattr(obj, k) == v for k, v in kw.items())
    return wrapper

然后过滤对象:

filtered = list(filter(check_attrs(signal='CO'), objects))

或者

filtered = [obj for obj in objects
            if check_attrs(signal='CO')(obj)]

相关问题 更多 >