我有一个n个主键列表:
primary_keys = ['pkey1', 'pkey2', ..., 'pkeyn']
我有一个关键/值的字典:
kw = {'pkey1': 123, 'pkey2': 456, ..., 'pkeyn': 789, 'other': 'abc', 'values': 'def'}
我有一个实例列表:
instances = [obj, obj, obj]
我想在实例列表中找到主键与我的kw
词典中的主键值匹配的那个。
在Python中有一种简单的方法吗?
注意:我很确定我不会有超过2个PK,但是为了以防万一,我希望允许更多。
答案 0 :(得分:1)
如果只有一个匹配的实例,那么这样的东西应该有效。
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]
。
示例用法(简化为其主键集的实例):
>>> instances = [{'a': 5, 'b': 3}, {'a': 7, 'b': 8}, {'a': -1, 'b': 19}]
>>> primary_keys = ['a', 'b']
>>> kw = {'a': 7, 'b': 8}
>>> next(inst for inst in instances
... if all(inst[pkey] == kw[pkey] for pkey in primary_keys))
{'a': 7, 'b': 8}
如果没有实例与键匹配,则会引发StopIteration
,您可以轻松地使用try
块进行捕获。如果你想保留所有匹配的实例,你可以简单地将上面的内容转换为列表理解:
[inst for inst in instances
if all(get_key_value(inst, pkey) == kw[pkey] for pkey in primary_keys)]
答案 1 :(得分:0)
这样的事情怎么样?
match = []
for instance in instances:
if instance.key in kw:
match.append(instance)
答案 2 :(得分:0)
以下是带有测试的实际工作代码:
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