我有一个包含网址的列表:file_url_list
,打印到:
www.latimes.com, www.facebook.com, affinitweet.com, ...
另一个Top 1M网址列表:top_url_list
,打印到此:
[1, google.com], [2, www.google.com], [3, microsoft.com], ...
我想查找file_url_list
中top_url_list
中有多少个网址。我写了下面的代码,但我知道它不是最快的方法,也不是最蟒蛇的方法。
# Find the common occurrences
found = []
for file_item in file_url_list:
for top_item in top_url_list:
if file_item == top_item[1]:
# When you find an occurrence, put it in a list
found.append(top_item)
我怎样才能以更有效率和更快速的方式写出来?
答案 0 :(得分:7)
设置交叉点应该有帮助。此外,您可以使用生成器表达式仅从top_url_list
中的每个条目中提取URL。
file_url_list = ['www.latimes.com', 'www.facebook.com', 'affinitweet.com']
top_url_list = [[1, 'google.com'], [2, 'www.google.com'], [3, 'microsoft.com']]
common_urls = set(file_url_list) & set(url for (index, url) in top_url_list)
或同等地感谢Jean-François Fabre:
common_urls = set(file_url_list) & {url for (index, url) in top_url_list}
答案 1 :(得分:2)
你说你想知道文件中有多少网址在前1米列表中,而不是它们实际上是什么。构建一组较大的列表(我假设它将是1m),然后遍历另一个列表,计算每个列表是否在集合中:
top_urls = {url for (index, url) in top_url_list}
total = sum(url in top_urls for url in file_url_list)
如果文件列表较大,则构建该集合:
file_urls = set(file_url_list)
total = sum(url in file_urls for index, url in top_url_list)
sum
会将数字加在一起。 url in top_urls
评估为bool
,True
或False
。这将分别转换为整数1
或0
。 url in top_urls for url in file_url_list
有效地为1
生成0
或sum
的序列。
可能稍微有点效率(我必须对其进行测试),您可以过滤并仅1
来url in top_urls
:
total = sum(1 for url in file_url_list if url in top_urls)
答案 2 :(得分:1)
您可以从第二个列表中获取网址,然后使用set
作为Kos在其答案中显示,或者您可以将lambda与过滤器一起使用。
top_url_list_flat = [item[1] for item in top_url_list]
print filter(lambda url: url in file_url_list, top_url_list_flat)
在Python 3 filter
中返回一个可迭代的对象,所以你必须在下面做:
for common in (filter(lambda url: url in file_url_list, top_url_list_flat)):
print (common)