在Python中查找具有多个主键的列表中的对象

2024-06-07 18:41:49 发布

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

我有一个n个主键的列表:

primary_keys = ['pkey1', 'pkey2', ..., 'pkeyn']

我对键/值有一个判断:

^{pr2}$

我有一个例子:

instances = [obj, obj, obj]

我想在实例列表中找到主键与我的kwdict中主键值匹配的那个

在Python中有没有一种简单的方法可以做到这一点?在

注意:我很确定我不会有超过2个PK,但我想考虑更多,以防万一。在


Tags: instances实例obj列表keys例子键值主键
3条回答

这是一个实际的测试代码:

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]。在

示例用法(实例简化为其主键集):

^{pr2}$

如果没有与键匹配的实例,则会引发一个StopIteration,您可以使用try块轻松捕捉到这一点。如果要保留所有匹配的实例,只需将上述内容转换为列表理解:

[inst for inst in instances
      if all(get_key_value(inst, pkey) == kw[pkey] for pkey in primary_keys)]

相关问题 更多 >

    热门问题