2013-11-21 58 views
1

我有字典其中的列表我想過濾如果2個密鑰的值的2具有每一個定義的字符串過濾字典由值

例如,過濾器(A = BBB和d = EEE)在下面的列表...

[{A:BBB, C:DDD, D:EEE,...}, {A:BBB, C:DDD, D:ESS,...},{A:BBB, C:ASD, D:EEE,...},{C:ASD, D:EEE,...},...] 

將輸出

[{A:BBB, C:DDD, D:EEE,...},{A:BBB, C:ASD, D:EEE,...},...] 

任何幫助將不勝感激!

回答

4

試試這個,這是一個班輪應用列表解析:

# input data 
lst = [{'A':'BBB', 'C':'DDD', 'D':'EEE'}, 
     {'A':'BBB', 'C':'DDD', 'D':'ESS'}, 
     {'A':'BBB', 'C':'ASD', 'D':'EEE'}, 
     {'C':'ASD', 'D':'EEE'}] 

# list of filters 
flt = [('A', 'BBB'), ('D', 'EEE')] 

# a list comprehension + all() will do the trick 
[x for x in lst if all(x.get(k, None) == v for k, v in flt)] 
=> [{'A': 'BBB', 'C': 'DDD', 'D': 'EEE'}, {'A': 'BBB', 'C': 'ASD', 'D': 'EEE'}] 

這種方法的好處是,根據需要在你可以聲明儘可能多的鍵/值對過濾器,無論如何它會工作。

+1

這是一種更爲穩健的方法。 – dawg

-2
output = [d for d in list_of_dicts 
      if not (d['A'] == 'BBB' and d['D'] == 'EEE')] 
+0

如果其中一個鍵不存在於其中一個字典中,將會失敗 –

+0

謝謝!幫助很多 – user2950162

+0

@ÓscarLópez在這種情況下,我在所有字典中都有它......但如果不僅僅是爲了學習,你會怎麼做? – user2950162

0
result = [] 
for i in lst: 
    if i['A'] == "BBB" and i['D'] == "EEE": 
     result.append(i) 
+0

如果其中一個密鑰不存在於其中一個字典中,將會失敗 –

0
l = [{'A': 'BBB', 'C': 'DDD', 'D': 'EEE'}, {'A': 'BBB', 'C': 'DDD', 'D': 'ESS'}, 
    {'A': 'BBB', 'C': 'ASD', 'D': 'EEE'}, {'C': 'ASD', 'D': 'EEE'}] 
filterd = {'D': 'EEE', 'A': 'BBB'}           
[x for x in l if x.viewvalues() >= filterd.viewvalues()]     
[{'A': 'BBB', 'C': 'DDD', 'D': 'EEE'}, {'A': 'BBB', 'C': 'ASD', 'D': 'EEE'}]