根据各种类型和对象属性进行匹配

时间:2019-05-26 10:40:10

标签: python python-3.x dictionary object attributes

我有一个对象列表,我正在尝试根据所选条件从中过滤对象,并返回匹配列表。这些属性是字符串,整数,浮点数和对象。我遇到的问题是尝试根据对象属性进行过滤,我想这样做:

  

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

我不能简单地自己比较对象,因为我只需要根据最重要的属性进行匹配,并且各个对象的属性都不同。

到目前为止,我可以成功地将对象拼合为字典,然后进行简单的字典比较。但这很丑,我怀疑很慢:

  

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'))

是否有更理想,更直接的方法?

1 个答案:

答案 0 :(得分:0)

如果您要按属性过滤对象,请使用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)]