按上的相同键排序和分组

2024-05-29 04:33:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我想按其TLDs对包含URL的列表进行分组

我的代码如下所示:

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)

问题是我调用方法extract2*n次(where n == len(urls)),第一次调用n次是在排序时,第二次调用n次是在分组时。 有可能做n次吗?你知道吗


Tags: lambdakey代码fromimporturl列表extract
2条回答

根据URL列表的大小,如果一次构建一个包含所有提取的满足项的列表,然后在索引列表上使用索引对排序分组,则可以加快速度:

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)的总时间远远超过索引新列表所用的时间,那么速度将远远超过边际。你知道吗

如果首先将后缀添加为元组,则可以按如下所示进行排序和分组,而无需重新计算:

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)

在本例中,您将得到:

com [('com', 'www.abc.com'), ('com', 'www.example.com'), ('com', 'www.test.com')]
org [('org', 'www.mytest.org')]

相关问题 更多 >

    热门问题