2016-11-14 45 views
0

我想組的URL列表,其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 * N次(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

根據如果您建立了所有提取足夠的列表一次,然後在索引列表中使用索引和

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)遠遠超過時間採取索引新的列表。