辞書のリストがあり、各辞書には(たとえば)'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ループでこれを実行できることを知っています。しかし、もっと簡単な方法が必要だと思います。私はこの質問のさまざまなフレーバーを見つけましたが、実際に法案に合ったものはなく、質問に答えました。私は答えに試みを投稿します...しかし、彼らはそれほど印象的ではありませんでした。おそらくオープンのままにしておくのが最善です。どんな援助も大歓迎です。
リストコンプを試すことができます
>>> 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'}]
filter
を使用するか、exampleSet
の辞書の数が多すぎる場合は、ifilter
モジュールのitertools
を使用します。システムのメモリをリスト全体で一度に埋めるのではなく、イテレータを返します。
from itertools import ifilter
for elem in ifilter(lambda x: x['type'] in keyValList, exampleSet):
print elem