Удалить элементы в списке на основе списка подстрок в другом списке в python3.x - PullRequest
2 голосов
/ 28 мая 2019

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

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

list2 = ['lunch','noon']

Требуемый вывод:

output = ['sandwich shop','grocery store']

Ответы [ 3 ]

2 голосов
/ 28 мая 2019

Использование Regex.

Пример:

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']
1 голос
/ 28 мая 2019

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

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. Если ничего не было похоже, добавьте элемент из списка1 в список3.
  7. Повторяйте, пока не останется больше предметов.
1 голос
/ 28 мая 2019

Один из подходов состоит в том, чтобы выполнить итерацию для копии 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']
...