2017-02-21 14 views
1
results = [ 
     {'id': 1, 'text': 'String 55 - 1' }, 
     {'id': 2, 'text': 'String 3 - 2' }, 
     {'id': 3, 'text': 'String 5 - 4 - 1'}] 

str = [' 5 ', ' 4 '] 

Я хочу, чтобы удалить из results каждого словаря, который не содержит каждую строку в списке str в text. На данный момент я могу сделать это с одним условием, например:Python - Удалить словарь из списка словарей, если список строк не в словаре ключа

results[:] = [d for d in results if lst[0] in d['text']] 

Но это не будет проверять, если ' 4 ' в тексте тоже.

+0

Его ясно, что вам нужно 2 петли. –

+0

Я думаю, что вы назвали свой список строк 'str', но в понимании вы используете' lst'. Возможно, вы можете отредактировать свой вопрос, чтобы он был поддающимся проверке? :) – MSeifert

ответ

3

Просто используйте all, чтобы проверить, если все элементы в списке в словаре значение и использовать его в фильтре из списка вашего понимания:

lst = [' 5 ', ' 4 '] 
results[:] = [d for d in results if all(i in d['text'] for i in lst)] 
print(results) 
# [{'text': 'String 5 - 4 - 1', 'id': 3}] 
2

Вы можете использовать all в состояние вашего понимания:

results = [ 
     {'id': 1, 'text': 'String 55 - 1' }, 
     {'id': 2, 'text': 'String 3 - 2' }, 
     {'id': 3, 'text': 'String 5 - 4 - 1'}] 

strs = [' 5 ', ' 4 '] # you shouldn't name it "str" because that's a builtin function 

>>> [dct for dct in results if all(substr in dct['text'] for substr in strs)] 
[{'id': 3, 'text': 'String 5 - 4 - 1'}] 

Вы Коула d также использовать set.issubset и str.split вместо:

strs = {'5', '4'} # this is a set! 

[dct for dct in results if strs.issubset(dct['text'].split())] 

Это будет проверить, если ваш ['text'] расщепляется на непечатаемых содержит все символы в strs. В зависимости от длины text и количества элементов в strs это может быть быстрее, чем all-Approach.