Python 我怎样才能以一种更高效、更通俗的方式编写以下代码?

Python 我怎样才能以一种更高效、更通俗的方式编写以下代码?,python,python-3.x,Python,Python 3.x,我有一个带有url的列表:文件\u url\u列表,它打印到以下位置: www.latimes.com, www.facebook.com, affinitweet.com, ... [1, google.com], [2, www.google.com], [3, microsoft.com], ... 以及另一个排名前1M的url列表:Top\u url\u list,该列表打印到: www.latimes.com, www.facebook.com, affinitweet.com,

我有一个带有url的列表:
文件\u url\u列表
,它打印到以下位置:

www.latimes.com, www.facebook.com, affinitweet.com, ...
[1, google.com], [2, www.google.com], [3, microsoft.com], ...
以及另一个排名前1M的url列表:
Top\u url\u list
,该列表打印到:

www.latimes.com, www.facebook.com, affinitweet.com, ...
[1, google.com], [2, www.google.com], [3, microsoft.com], ...
我想找到
文件url\u列表
中有多少url在
顶部url\u列表
中。我已经编写了以下代码,但我知道这不是最快的方法,也不是最具python风格的方法

# 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)

我怎样才能以一种更有效、更通俗的方式来写这篇文章呢

您可以从第二个列表中获取URL,然后按照他的回答使用
set
,或者使用lambda和filter

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)

设置交叉点应该有帮助。此外,您还可以使用生成器表达式仅从
top\u url\u列表
中的每个条目中提取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)
或相当于由于:


你说你想知道文件中有多少URL在前1m列表中,而不是它们实际上是什么。构建一组较大的列表(我假设它将是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中的code>url计算为
bool
,或者
True
或者
False
。这将分别转换为整数、
1
0
<文件url列表中url的顶部url中的代码>url有效地为
sum
生成一个
1
0
序列

也许效率稍高一点(我必须测试一下),如果顶部url中的
url
,您可以过滤并只对
1
s求和:

total = sum(1 for url in file_url_list if url in top_urls)

为什么要将计数器存储为列表的第一个元素?这实际上使事情变得复杂。有什么理由这样做吗?如果目标是“找到多少url[…]在最上面的url列表中”,为什么你什么都不算?你为什么要将它们添加到列表中有什么特别的原因吗?当你从
top\u url\u list
中删除计数器时,这可能会重复,但是,答案中没有提到它。糟糕的是,我没有注意到第二个列表。
file\u url\u list中的url
执行线性搜索使用集合理解:
set(用于(索引,url)在top\u url列表中)
=>
{url for(index,url)在top\u url列表中}
非常快速和优雅。谢谢。如果你要扔掉它们,你真的需要构建两套吗?也许
{url for(index,url)在top\u url列表中}。交叉点(文件url列表)
。看,这需要一个iterable。@PeterWood哦,这是个好建议。
&
需要两个集合,但
交叉点
不需要。