2024-06-07 18:41:49 发布
网友
我有一个n个主键的列表:
primary_keys = ['pkey1', 'pkey2', ..., 'pkeyn']
我对键/值有一个判断:
我有一个例子:
instances = [obj, obj, obj]
我想在实例列表中找到主键与我的kwdict中主键值匹配的那个
kw
在Python中有没有一种简单的方法可以做到这一点?在
注意:我很确定我不会有超过2个PK,但我想考虑更多,以防万一。在
这是一个实际的测试代码:
primary_keys = ['pkey1', 'pkey2', 'pkey3'] kw = {'pkey1': 123, 'pkey2': 456, 'pkey3': 789, 'other': 'abc', 'values': 'def'} def obj_matches(obj): for key in kw.keys(): if key.startswith('pkey') and getattr(obj, key) == kw[key]: return True return False class Foo(object): def __init__(self, pkey1, pkey2, pkey3): self.pkey1, self.pkey2, self.pkey3 = pkey1, pkey2, pkey3 instances = [Foo(123, 0, 0), Foo(0, 456, 0), Foo(0, 0, 789), Foo(1, 2, 3)] matches = [] for obj in instances: if obj_matches(obj): matches.append(obj) for m in matches: print m.pkey1, m.pkey2, m.pkey3
这样的怎么样?在
match = [] for instance in instances: if instance.key in kw: match.append(instance)
如果只有一个实例匹配,类似这样的方法应该有效。在
next(inst for inst in instances if all(get_key_value(inst, pkey) == kw[pkey] for pkey in primary_keys))
其中get_key_value是返回给定实例的给定键值的函数。 如果键是实例的简单属性,则可以使用getattr,而如果实例是dict-就像你可以使用inst[pkey]。在
get_key_value
getattr
dict
inst[pkey]
示例用法(实例简化为其主键集):
如果没有与键匹配的实例,则会引发一个StopIteration,您可以使用try块轻松捕捉到这一点。如果要保留所有匹配的实例,只需将上述内容转换为列表理解:
StopIteration
try
[inst for inst in instances if all(get_key_value(inst, pkey) == kw[pkey] for pkey in primary_keys)]
这是一个实际的测试代码:
这样的怎么样?在
如果只有一个实例匹配,类似这样的方法应该有效。在
其中
get_key_value
是返回给定实例的给定键值的函数。 如果键是实例的简单属性,则可以使用getattr
,而如果实例是dict
-就像你可以使用inst[pkey]
。在示例用法(实例简化为其主键集):
^{pr2}$如果没有与键匹配的实例,则会引发一个
StopIteration
,您可以使用try
块轻松捕捉到这一点。如果要保留所有匹配的实例,只需将上述内容转换为列表理解:相关问题 更多 >
编程相关推荐