Эффективный способ проверить, содержат ли элементы списка все элементы другого списка

65
8

У меня есть список строк с именем strList который содержит около 800,000-2,200,000 элементов. Каждый элемент содержит около 100 символов. У меня есть еще один список строк, называемый findStrs который обычно содержит менее 5 элементов (от 5 до 10 символов). Я хочу выбрать элементы strList которые содержат все элементы в findStrs. Как я могу эффективно это сделать в Python? Вот как я это делаю, но мне интересно, есть ли более эффективные решения с использованием списков для этого:

finalStrList = []
for strr in strList:
temp = []
for findStr in findStrs:
if findStr in strr:
temp.append(findStr)
if len(temp) == len(findStrs):
finalStrList.append(str)
print(finalStrList)

Я также попытался разработать метод, основанный на понимании списка, но, что не удивительно, он не работает:

[strr for strr in strList if [findStr in strr for findStr in findStrs]]

спросил(а) 2021-01-19T18:02:19+03:00 9 месяцев назад
1
Решение
65

Как предложил juanpa.arrivillaga в разделе комментариев, я могу сделать то, что я хочу, легко используя следующее решение на основе понимания списка:

[s for s in strList if all([x in s for x in findStrs])]

ответил(а) 2021-01-19T18:02:19+03:00 9 месяцев назад
47

Если скорость матча не очень высока, мы можем уменьшить временную сложность.

finalStrList = []
for strr in strList:
flag = True
for findStr in findStrs:
if findStr not in strr:
flag = False
break
if flag:
finalStrList.append(str)
print(finalStrList)

ответил(а) 2021-01-19T18:02:19+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема