2016-11-14 3 views
0

Я хочу, чтобы сгруппировать список с контентом, его TLDsСортировка и группировка по тому же ключу раза

Моего кода выглядит следующим образом:

from itertools import groupby 
from tldextract import extract 

urls = sorted(urls, key=lambda x: extract(x).suffix) 
grouped_urls = groupby(urls, key=lambda x: extract(x).suffix) 

Проблема заключается в том, что я называю методом extract 2 * п раз (where n == len(urls)), сначала n раз при сортировке, а во втором n раз при группировке. Можно ли сделать это n раз?

ответ

3

Если вы сначала добавить суффикс в виде кортежа, вы можете сортировать и GroupBy без необходимости пересчитывать его следующим образом:

from itertools import groupby 
from tldextract import extract 

urls = ["www.example.com", "www.mytest.org", "www.test.com", "www.abc.com"] 
urls = [(extract(url).suffix, url) for url in urls] 

for k, g in groupby(sorted(urls), key=lambda x: x[0]): 
    print k, list(g) 

В этом примере вы получите:

0

В зависимости все, насколько велико ваш список URL-адресов, вы можете получить некоторую скорость, если один раз вы создали список всех извлеченных достаточных значений, а затем используйте индексирование в списке индексов до sort и group:

from itertools import groupby, count 
from tldextract import extract 

c1, c2 = count(), count() 

lst = [extract(x).suffix for x in urls] 
urls = sorted(urls, key=lambda _: lst[next(c1)]) 
grouped_urls = groupby(urls, key=lambda _: lst[next(c2)]) 

Недостатком этого является то, что вы будете делать O(1) индексирование 2n раза, а скорость до будет более маргинальным, если общее время extract(x) в списке гораздо больше, чем время, чтобы индексировать новый список.