web-dev-qa-db-ja.com

pythonキー値に基づいた辞書のフィルターリスト

辞書のリストがあり、各辞書には(たとえば)'type1''type2'などの値を持つことができる 'type'のキーがあります。私の目標は、これらの辞書をリストにフィルタリングすることです同じ辞書ですが、特定の「タイプ」のものだけです。私はlist/dictionary内包表記に本当に苦労しているだけだと思います。

したがって、リストの例は次のようになります。

exampleSet = [{'type':'type1'},{'type':'type2'},{'type':'type2'}, {'type':'type3'}]

キー値のリストがあります。たとえば、次のようにします。

keyValList = ['type2','type3']

予想される結果のリストは次のようになります。

expectedResult = [{'type':'type2'},{'type':'type2'},{'type':'type3'}]

一連のforループでこれを実行できることを知っています。しかし、もっと簡単な方法が必要だと思います。私はこの質問のさまざまなフレーバーを見つけましたが、実際に法案に合ったものはなく、質問に答えました。私は答えに試みを投稿します...しかし、彼らはそれほど印象的ではありませんでした。おそらくオープンのままにしておくのが最善です。どんな援助も大歓迎です。

41
m25

リストコンプを試すことができます

>>> exampleSet = [{'type':'type1'},{'type':'type2'},{'type':'type2'}, {'type':'type3'}]
>>> keyValList = ['type2','type3']
>>> expectedResult = [d for d in exampleSet if d['type'] in keyValList]
>>> expectedResult
[{'type': 'type2'}, {'type': 'type2'}, {'type': 'type3'}]

別の方法は filter を使用することです

>>> list(filter(lambda d: d['type'] in keyValList, exampleSet))
[{'type': 'type2'}, {'type': 'type2'}, {'type': 'type3'}]
78
Bhargav Rao

filterを使用するか、exampleSetの辞書の数が多すぎる場合は、ifilterモジュールのitertoolsを使用します。システムのメモリをリスト全体で一度に埋めるのではなく、イテレータを返します。

from itertools import ifilter
for elem in ifilter(lambda x: x['type'] in keyValList, exampleSet):
    print elem
15
Saksham Varma