0

n個の主キーのリストがあります。

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

そして私はキー/値の口述を持っています:

kw = {'pkey1': 123, 'pkey2': 456, ..., 'pkeyn': 789, 'other': 'abc', 'values': 'def'}

そして私はインスタンスのリストを持っています:

instances = [obj, obj, obj]

kwインスタンスのリストで、主キーが私のdictの主キー値と一致するものを見つけたいと思います。

Pythonでこれを行う簡単な方法はありますか?

:PKは2つを超えることはないと確信していますが、万が一の場合に備えて、さらに多くのPKを使用できるようにしたいと思います。

4

3 に答える 3

1

一致するインスタンスが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-likeの場合はを使用できます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}

キーに一致するインスタンスがない場合は、aが発生します。これは、ブロックStopIterationで簡単にキャッチできます。try一致するすべてのインスタンスを保持したい場合は、上記をリスト内包に変換するだけです。

[inst for inst in instances
      if all(get_key_value(inst, pkey) == kw[pkey] for pkey in primary_keys)]
于 2013-03-27T08:48:12.197 に答える
0

このようなものはどうですか?

match = []
for instance in instances:
    if instance.key in kw:
        match.append(instance)
于 2013-03-27T08:47:43.640 に答える
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
于 2013-03-27T08:58:01.867 に答える