Удалить ссылки из списка
Есть список доменов
a = ['*.abc.ru', '*.def.com', '*.qwery.ru']
И есть список ссылок
b = ['http://abc.ru', 'http://def.com', 'http://qwery.ru']
из ссылок я могу получить домен
for link in b:
link.split('/')[2]
но как мне удалить из списка все ссылки, которые содержат домены из списка "a"?
Ответы (2 шт):
Как я понял на выходе вы хотите иметь список со ссылками, у которых хосты не содержатся в списке a. Если это так, то держите вот это:
a = ['*.abc.ru', '*.def.com', '*.qwery.ru']
b = ['http://abc.ru', 'http://def.com', 'http://qwery.ru', 'https://test.com', 'http://googgle.ru']
a_clear = [item.replace('*.', '') for item in a]
result = []
for item in b:
flag = True
for host in a_clear:
if host in item:
flag = False
if flag:
result.append(item)
Я делаю список с хостами без лишних знаков, затем пробегаюсь по спискам и нахожу совпадение, если такое существеут, то переменная flag принимает значение False и данные в результирующий список не попадают. Поскольку я добавил две ссылки с неопределенными хостами в a, то результат исполнения будет
>>> print(result)
['https://test.com', 'http://googgle.ru']
Здесь я создаю отдельную переменную result, куда помещаю необходимые данные. Почему так? Тип данных list - это изменяемый тип данных и если применять методы удаления в цикле, то могут появиться неожиданные результаты на выходе, поскольку длина списка и индексация будут меняться в течении работы этого цикла.
Если есть необходимость сохранить имя переменной b, то в конце работы скрипта определите следующее
b = result[:]
То есть сделать копию списка result в b.
при желании можно втиснуть все в одно списковое включение (list comprehension), примерно так:
a = ['*.abc.ru', '*.def.com', '*.qwery.ru']
b = ['http://abc.ru', 'http://def.com', 'http://qwery.ru', 'https://mail.ru', 'https://yandex.ru']
res = [i for i in b if not any(i.endswith(j[2:]) for j in a)]
>>> res
'''
['https://mail.ru', 'https://yandex.ru']