2017-05-23 18 views
0

別のリスト内のすべての項目が含まれている場合は、しかし、約500項目に:Pythonは - に基づいて、辞書のフィルタリストは、キーの値は、私はこのようになります辞書のリストを持っている

listOfDicts = [{'ID': 1, 'abc': {'123': 'foo'}}, ... {'ID': 7, 'abc': {'123':'foo','456': 'bar'}}] 

sampleFilterList = ['123', '456'] 

私はフィルタリングしようとしています

[{'ID': 7, 'abc': {'123':'foo','456': 'bar'}}, ...] 

は私が[i for i in listOfDicts if a for a in sampleFilterList in i['abc']]を試してみましたが、私はGETT午前:sampleFilterList内のすべての値が、結果はリストでなければなりません

キー「ABC」にあるすべての結果のためにlistOfDicts INGのあなたがある場合は、エラーを投げるのデフォルト値を代わりに返した、より安全になりますgetを使用しても、リスト内包でキーワードにで条件テストを移動し、する必要がUnboundLocalError: local variable 'a' referenced before assignment

+0

結果リストの2番目の項目を削除することを検討してください。結果の場所がわからないためです。 – DyZ

答えて

2

まず、より効率的な比較のためにセットに2番目のリストを変換します

sampleFilterSet = set(sampleFilterList) 

、上記のセットに各リスト項目の「ABC」キーを比較:

[item for item in listOfDicts if not (sampleFilterSet - item['abc'].keys())]  
#[{'ID': 7, 'abc': {'123': 'foo', '456': 'bar'}}] 

これは、最速のソリューションです。よりPython的(やや遅い)ソリューションはfilter()を使用することです:

list(filter(lambda item: not (sampleFilterSet - item['abc'].keys()), listOfDicts)) 
#[{'ID': 7, 'abc': {'123': 'foo', '456': 'bar'}}] 
+0

項目['abc']のキーにもsampleFilterSet以外の値があるとどうなりますか?たとえば、5つのキーが含まれていれば、そのうち2つはセットに含まれていますか? – Prajoth

+0

右。訂正された答えを確認してください – DyZ

+0

ありがとう、それは動作します!声明の一部ではないかどうかを説明してもらえますか? sampleSetのすべてがアイテム['abc']。keys()にあるかどうかチェックしていますか? – Prajoth

2

listOfDicts = [{'ID': 1, 'abc': {'123': 'foo'}}, {'ID': 7, 'abc': {'123':'foo','456': 'bar'}}] ​ 
sampleFilterList = ['123', '456'] 

[d for d in listOfDicts if all(s in d.get('abc', {}) for s in sampleFilterList)] 
# [{'ID': 7, 'abc': {'123': 'foo', '456': 'bar'}}] 

それとも@DYZのようセットを使用している場合、あなたはissubsetを使用することができます:

filterSet = set(sampleFilterList) 
[d for d in listOfDicts if filterSet.issubset(d.get('abc', {}))] 
# [{'ID': 7, 'abc': {'123': 'foo', '456': 'bar'}}] 
012リスト内のすべての辞書のキーワード abcを持っているかどうかわかりません
0

ここでは、ネストされたリストの内包との作業バージョンです。あなたの問題は、a for a in...がリストの理解であり、新しいリストの作成に使用する必要があるということです。

[i for i in listOfDicts if [a for a in sampleFilterList if a in i['abc']] == sampleFilterList] 
0
for i in zip(listOfDicts): 
a = i[0]['abc'] 
print (a) 

か:

for i in zip(listOfDicts): 
    if 'abc' in i[0]: 
     a = i 
     print (a) 

これはそれを行うためのエレガントな方法ですが、私はそれが役に立つことを願っています。

0

次のワンライナーを試みることができる:

passed_the_filter = [[dictionary_entry for dictionary_entry in list_of_dicts if filter_test in dictionary_entry['abc']] for filter_test in filter] 

それは、フィルタと辞書リストの両方を反復処理することをネストされたリストの内包表記です。フィルタが辞書エントリの「abc」値のキーであるかどうかをチェックします。あなたの問題は、間違ったリストの理解構文を使用したことでした。


N.B.要素に "abc"キーがあることを確認できない場合があります。


ありがとうございます。

関連する問題