2024-06-14 02:30:06 发布
网友
我想迭代两个列表。第一个列表包含一些浏览器用户代理,第二个列表包含这些浏览器的版本。我只想过滤掉那些版本大于60的用户代理。在
以下是我的列表理解效果:
[link for ver in version for link in useragents if ver > 60]
这个列表的问题是它多次打印同一个用户代理。我使用zip函数编写了以下代码,该函数运行良好:
zip
为什么我的列表理解返回意外结果?在
[link for (link, ver) in zip(useragents, version) if ver > 60]
你还得把这两张单子压缩在一起。在
相当于你的第一个理解:
res = [] for ver in version: for link in useragents: if ver > 60: res.append(link)
注意,您有一个时间复杂度为O的嵌套循环(n2),也就是说,您正在迭代version和useragents的每个组合。这不是您想要的,假设您的version和useragents列表对齐。在
version
useragents
与for循环等效的是以下列表理解:
for
这个
与zip不同。它不是并行迭代两个序列。它迭代了这两个序列的所有组合。在
就好像你写了:
因此,如果两个序列的长度都是5,那么将有25个组合(其中一些组合被条件ver > 60过滤掉)。在
ver > 60
当你想并行地处理序列时,zip是一种方法,即使在理解中也是如此。在
你还得把这两张单子压缩在一起。在
相当于你的第一个理解:
注意,您有一个时间复杂度为O的嵌套循环(n2),也就是说,您正在迭代
version
和useragents
的每个组合。这不是您想要的,假设您的version
和useragents
列表对齐。在与
^{pr2}$for
循环等效的是以下列表理解:这个
与zip不同。它不是并行迭代两个序列。它迭代了这两个序列的所有组合。在
就好像你写了:
^{pr2}$因此,如果两个序列的长度都是5,那么将有25个组合(其中一些组合被条件
ver > 60
过滤掉)。在当你想并行地处理序列时,
zip
是一种方法,即使在理解中也是如此。在相关问题 更多 >
编程相关推荐