我有一个对象列表,我正在尝试根据所选条件从中过滤对象,并返回匹配列表。这些属性是字符串,整数,浮点数和对象。我遇到的问题是尝试根据对象属性进行过滤,我想这样做:
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'))
是否有更理想,更直接的方法?
答案 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)]