Удалить дубликаты по совпадению - PullRequest
0 голосов
/ 06 января 2020

Учитывая наличие этого списка:

data = ["http://x.com/", "http://x.com/some/dir/", "http://x.com/other", "http://y.com/something", "http://y.com/else"]

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

http://x.com/
http://y.com/something

Я знаю о list(set(data)) трюк, но это не так t работать для этого случая.

Я думал об итерации и превращении ее в dict в качестве ключа: форма значения, так что домен является ключом, а значение - это весь URL-адрес, и он принимает только одно происшествие, но я думаю, что техника дурацкая и не pythoni c.

1 Ответ

2 голосов
/ 06 января 2020

Это дает вам одну запись на домен (случается, последняя, ​​а не первая):

from urllib.parse import urlparse

data = ["http://x.com/", "http://x.com/some/dir/", "http://x.com/other", "http://y.com/something", "http://y.com/else"]

result = list({urlparse(url).netloc: url for url in data}.values())

Если вы предпочитаете первую:

result = list({urlparse(url).netloc: url for url in reversed(data)}.values())
print(result)

Результат:

['http://y.com/something', 'http://x.com/']

Это работает следующим образом:

  • urlparse('https://somedomain.com/some/path') сломает URL, и одна из частей .netloc - это домен, который вы ищете, то есть 'somedomain.com'
  • {urlparse(url).netloc: url for url in reversed(data)} переворачивает список data, а затем для каждого url в списке он получает домен и добавляет запись в словарь, который создается с доменом в качестве ключа и URL-адресом в качестве ценность; так как ключи в словаре должны быть уникальными, каждый тип, который принадлежит одному и тому же домену, запись перезаписывается (следовательно, обращение)
  • list(somedict.values()) просто берет значения словаря и превращает их в простой список .

Итак, это объясняет, как result = list({urlparse(url).netloc: url for url in data}.values()) приводит к тому же результату, что и result = ['http://y.com/something', 'http://x.com/'] для вашего ввода data.

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