Пытаетесь найти уникальные подмассивы и подэлементы?

У меня есть массив, состоящий из подмассивов, содержащих [имя_страницы, URL-адрес и идентификатор] в dirty_pages. Этот массив содержит повторяющиеся подмассивы.

Мне нужно разобрать каждый subarray в dirty_pages на clean_pages так, чтобы:

  1. нет дубликатов (повторяющийся подмассив)

  2. 1st index в подмассиве, т.е. URL-адрес должен быть уникальным! Например, этот URL-адрес должен считаться одним (url/#review остается тем же URL-адресом):

    file:///home/joe/Desktop/my-projects/FashionShop/product.html#review
    

    и

    file:///home/joe/Desktop/my-projects/FashionShop/product.html
    

Моя текущая попытка возвращает clean_pages с 6 подмассивами (дубликаты!), В то время как правильный ответ должен быть 4

# clean pages
clean_pages = []


# dirty pages
dirty_pages = [
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/joe/Desktop/my-projects/FashionShop/index.html', '1608093980462.042'],
  ['Put a Sock in It Heel Boot | Nasty Gal', 'file:///home/joe/Desktop/my-projects/FashionShop/nastygal-product.html', '1608093980462.042'],
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/joe/Desktop/my-projects/FashionShop/index.html', '1608093980462.042'],
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/joe/Desktop/my-projects/FashionShop/index.html', '1608093980462.042'],
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/joe/Desktop/my-projects/FashionShop/product.html', '1608093980462.042'],
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/joe/Desktop/my-projects/FashionShop/product.html#review', '1608093980462.042'],
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/joe/Desktop/my-projects/FashionShop/product.html#review', '1608093980462.042'],
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/joe/Desktop/my-projects/FashionShop/index.html', '1608093980462.042'],
  ['Put a Sock in It Heel Boot | Nasty Gal', 'file:///home/joe/Desktop/my-projects/FashionShop/nastygal-product.html', '1608093980462.042'],
  ['ICONIC EXCLUSIVE - Game Over Drop Crotch Track Pants - Kids by Rock Your Kid Online | THE ICONIC | Australia', 'file:///home/joe/Desktop/my-projects/FashionShop/iconic-product.html', '1608093980462.042'],
   ['Put a Sock in It Heel Boot | Nasty Gal', 'file:///home/joe/Desktop/my-projects/FashionShop/nastygal-product.html', '1608093980462.042'],
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/shahyan/Desktop/my-projects/FashionShop/index.html/#review', '1608093980462.042'],
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/shahyan/Desktop/my-projects/FashionShop/index.html/?123', '1608093980462.042'],
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/shahyan/Desktop/my-projects/FashionShop/index.html/', '1608093980462.042'],
    ]




# clean data - get unique pages for each session
for j in range(len(dirty_pages)):
    page_name = dirty_pages[j][0]
    page_url = dirty_pages[j][1]
    page_sessionId = dirty_pages[j][2]

    not_seen = False

    if len(clean_pages) == 0:
        clean_pages.append([page_name, page_url, page_sessionId])
    else:
        for i in range(len(clean_pages)):
            next_page_name = clean_pages[i][0]
            next_page_url = clean_pages[i][1]
            next_page_sessionId = clean_pages[i][2]

            if page_url != next_page_url and page_name != next_page_name \
                    and page_sessionId == next_page_sessionId:
                not_seen = True
            else:
                not_seen = False

    if not_seen is True:
        clean_pages.append([page_name, page_url, page_sessionId])

print("$$$ clean...", len(clean_pages))

# correct answer should be 4 - as anyting after url e.g. #review is still duplicate!

ПРИМЕР ОБНОВЛЕНИЯ. Приносим извинения, если пример неясен (точно так же, как # после URL-адреса, их следует рассматривать как один URL-адрес)

'file:///home/joe/Desktop/my-projects/FashionShop/index.html/'

'file:///home/joe/Desktop/my-projects/FashionShop/index.html/?123'

'file:///home/joe/Desktop/my-projects/FashionShop/index.html'

Предложение: 1) Напишите функцию clean_url, которая принимает URL-адрес и выводит стандартную форму для этого URL-адреса (например, удаление #review) 2) Используйте python set для хранения ваших URL-адресов, поэтому дубликаты автоматически обрабатываются.

Stef 17.12.2020 15:39
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
71
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете сделать:

for j in dirty_pages:
    page_name = j[0]
    long_url = j[1]
    split_url = long_url.split('#')
    short_url = split_url[0]
    page_sessionID = j[2]
    edited_subarray = [page_name, short_url, page_sessionID]
    if edited_subarray not in clean_pages:
        clean_pages.append(edited_subarray)

Если вам не нужно сохранить часть URL-адреса «#review» в вашем списке clean_pages.

Возможно, вы захотите отобразить предупреждение, если '/' in split_url[1]

Stef 17.12.2020 15:41

Пожалуйста, проверьте рассматриваемый пример обновления. URL-адрес по-прежнему дублируется, если есть что-то еще после /, то есть «../index.html/?123» и «.../index.html/#review» должны считаться уникальными

Shaz 18.12.2020 06:44

Моей единственной другой мыслью было бы разделить ('.html') вместо ('#').

jmaloney13 18.12.2020 19:33
Ответ принят как подходящий

Вы можете использовать furl для нормализации URL.

from furl import furl

# Iterate over each page - subarray
for page in dirty_pages:
    # normalize url
    page[1] = furl(page[1]).remove(args=True, fragment=True).url.strip("/")

    # check if subarray already in clean_pages
    if page not in clean_pages:
        clean_pages.append(page)

Это частично верно, например, #review after url, ваш ответ дублирует URL-адрес с / в конце, например. '.../index.html/' и '../index.html/?123' и '../index.html' также остаются одним и тем же URL-адресом. См. пример в вопросе (просто для ясности)

Shaz 18.12.2020 06:30

Обновлен ответ для обработки случаев, как в новом примере.

Himanshu 18.12.2020 09:17

Я думаю, что по сути эта проблема сводится к тому, что существует уникальный URL-адрес. Если это так, то предыдущий способ проверки немного усложнен, и результаты, которые вы получали, сводились к простому добавлению первого элемента уникального имени. Следовательно, 6, однако, кажется, вам нужен уникальный URL.

Чтобы решить проблему #, я просто разделил URL вокруг хэштега и взял первую его часть. Обратите внимание, что будет получена только первая часть строки перед хэштегом. Так что это может вызвать проблемы, если их больше 1 #.

я тоже немного почистил

    # clean pages
clean_pages = []


# dirty pages
dirty_pages = [
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/joe/Desktop/my-projects/FashionShop/index.html', '1608093980462.042'],
  ['Put a Sock in It Heel Boot | Nasty Gal', 'file:///home/joe/Desktop/my-projects/FashionShop/nastygal-product.html', '1608093980462.042'],
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/joe/Desktop/my-projects/FashionShop/index.html', '1608093980462.042'],
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/joe/Desktop/my-projects/FashionShop/index.html', '1608093980462.042'],
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/joe/Desktop/my-projects/FashionShop/product.html', '1608093980462.042'],
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/joe/Desktop/my-projects/FashionShop/product.html#review', '1608093980462.042'],
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/joe/Desktop/my-projects/FashionShop/product.html#review', '1608093980462.042'],
  ['Fashion Shop | Free Bootstrap Themes by 365Bootstrap.com', 'file:///home/joe/Desktop/my-projects/FashionShop/index.html', '1608093980462.042'],
  ['Put a Sock in It Heel Boot | Nasty Gal', 'file:///home/joe/Desktop/my-projects/FashionShop/nastygal-product.html', '1608093980462.042'],
  ['ICONIC EXCLUSIVE - Game Over Drop Crotch Track Pants - Kids by Rock Your Kid Online | THE ICONIC | Australia', 'file:///home/joe/Desktop/my-projects/FashionShop/iconic-product.html', '1608093980462.042'],
   ['Put a Sock in It Heel Boot | Nasty Gal', 'file:///home/joe/Desktop/my-projects/FashionShop/nastygal-product.html', '1608093980462.042'],
]


used_url = []
used_names = []

# clean data - get unique pages for each session
for page in dirty_pages:
    page_name = page[0]
    page_url = page[1].split('#')[0]
    page_sessionId = page[2]

    if page_url not in used_url:
        used_url.append(page_url)
        clean_pages.append(page)

print(clean_pages)
print("$$$ clean...", len(clean_pages))

Пожалуйста, проверьте рассматриваемый пример обновления. URL-адрес по-прежнему дублируется, если есть что-то еще после /, то есть «../index.html/?123» и «.../index.html/#review» должны считаться уникальными

Shaz 18.12.2020 06:38

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