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
列表中每个字符串的每个字典。目前我可以用一个条件来做,例如:
results[:] = [d for d in results if lst[0] in d['text']]
但是,这也不会检查' 4 '
是否也在文本中。
答案 0 :(得分:3)
只需使用all
来测试所有列表中的项目是否在字典值中,并使用列表推导的过滤器中的项目:< / p>
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}]
答案 1 :(得分: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'}]
您也可以使用set.issubset
和str.split
代替:
strs = {'5', '4'} # this is a set!
[dct for dct in results if strs.issubset(dct['text'].split())]
这将检查您在{whomepaces分割的['text']
是否包含strs
中的所有字符。根据{{1}}的长度和text
中的项目数量,这可能比strs
- 方法更快。