Python сортирует уникальный список элементов списков - PullRequest
2 голосов
/ 24 сентября 2011

Кажется, я не могу найти вопрос на SO о моей конкретной проблеме, так что извините, если это было задано ранее!

Во всяком случае, я пишу скрипт для циклического прохождения набора URL-адресов и выдачи мне список уникальных URL-адресов с уникальными параметрами.

Проблема, с которой я столкнулся, заключается в сравнении параметров для устранения множественных дубликатов. Это немного сложно объяснить, поэтому некоторые примеры, вероятно, в порядке:

Скажем, у меня есть список URL-адресов, подобных этому

  • hxxp: //www.somesite.com/page.php ID = 3 & название = Derp
  • hxxp: //www.somesite.com/page.php ID = 4 & название = бла
  • hxxp: //www.somesite.com/page.php ID = 3 & с = 32 & название = вещь
  • hxxp: //www.somesite.com/page.php б = 33 & ID = 3

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

sort = [['id', 'title'], ['id', 'c', 'title'], ['b', 'id']]

Мне нужно найти способ дать мне только 2 списка в моем списке на тот момент:

new = [['id', 'c', 'title'], ['b', 'id']]

На данный момент у меня есть немного, чтобы разобраться с этим, я знаю, что я близко, и вот уже пару дней бьюсь головой об этом :(. Есть идеи?

Заранее спасибо! :)

РЕДАКТИРОВАТЬ: Извините, что не ясно! Этот скрипт предназначен для поиска уникальных точек входа для веб-приложений после паутинга. В основном, если URL имеет 3 уникальные точки входа

['id', 'c', 'title']

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

['id', 'title']

Так что мне нужен мой новый список списков, чтобы исключить список с 2 и отдать предпочтение списку ТОЛЬКО с 3, если меньшие переменные находятся в большем наборе. Если все еще неясно, дайте мне знать, и спасибо за быстрые ответы! :)

1 Ответ

5 голосов
/ 24 сентября 2011

Я предполагаю, что подмножества считаются "дубликатами" (конечно, не коммутативно) ...

Начните с преобразования каждого запроса в набор и упорядочения их от самых больших до самых маленьких. Затем добавьте каждый запрос в новый список, если он не является подмножеством уже добавленного запроса. Поскольку любой набор является подмножеством самого себя, эта логика охватывает точные дубликаты:

a = []
for q in sorted((set(q) for q in sort), key=len, reverse=True):
    if not any(q.issubset(Q) for Q in a):
        a.append(q)
a = [list(q) for q in a] # Back to lists, if you want
...