2013-11-21 3 views
1

У меня есть список словарей, которые я хотел бы фильтровать, если 2 значения 2 ключа есть каждый из них определенной строкисловаря Фильтрации по значениям

Например, фильтр (А = В и D = ЕЕЕ) в списке ниже ...

выход

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

Любая помощь будет оценена

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

Would!

ответ

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'}] 
Смежные вопросы