Удалить элементы в списке на основе списка подстрок в другом списке в python3.x

Я пытаюсь составить список строк на основе другого списка подстрок. Я хочу удалить строки в списке1, если строка содержит подстроку в списке2.

list1 = ['lunch time', 'sandwich shop', 'starts at noon','grocery store']

list2 = ['lunch','noon']

Результат, который я хочу:

output = ['sandwich shop','grocery store']
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
79
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Один из подходов состоит в том, чтобы перебрать копию list1 и удалить из нее строку, если она содержит подстроку из list2.

list1 = ['lunch time', 'sandwich shop', 'starts at noon','grocery store']

list2 = ['lunch','noon']

#Iterate on copy of list1
for item1 in list1[:]:
    #If substring is present, remove string from list
    for item2 in list2:
        if item2 in item1:
            list1.remove(item1)

print(list1)

Другой подход состоит в том, чтобы найти совпадающие подстроки, а затем вычесть этот результат из фактического списка.

list1 = ['lunch time', 'sandwich shop', 'starts at noon','grocery store']

list2 = ['lunch','noon']

#List of strings where the substrings are contained
result = [item1 for item1 in list1 for item2 in list2 if item2 in item1 ]

#List of strings where the substrings are not contained, found by set difference between original list and the list above
print(list(set(list1) - set(result)))

Вывод будет таким же в обоих случаях, как показано ниже

['grocery store', 'sandwich shop']
Ответ принят как подходящий

Использование регулярного выражения.

Бывший:

import re


list1 = ['lunch time', 'sandwich shop', 'starts at noon','grocery store']
list2 = ['lunch','noon']
pattern = re.compile(r"|".join(list2))
print([i for i in list1 if not pattern.search(i)]) 

Выход:

['sandwich shop', 'grocery store']

Это было так быстро. Спасибо.

song0089 28.05.2019 23:33

Так много разных способов сделать это. Вот мой подход (возможно, не лучший).

list1 = ['lunch time', 'sandwich shop', 'starts at noon','grocery store']
list2 = ['lunch','noon']


list3 = [x for x in list1 if len(set(list2) & set(x.split())) == 0]


print(list3)

Дает тебе:

['sandwich shop', 'grocery store']

Что происходит?

  1. Перебрать первые элементы списка.
  2. Преобразуйте элемент в массив слов, используя split().
  3. Преобразуйте этот массив и list2 в набор.
  4. Сделайте союз множеств, чтобы найти похожие.
  5. Подсчитайте, сколько было похожих, используя len().
  6. Если ничего похожего не было, то добавляем пункт из list1 в list3.
  7. Повторяйте до тех пор, пока не останется предметов.

Другие вопросы по теме