迭代两个列表的列表理解未按预期工作

2024-06-14 02:30:06 发布

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

我想迭代两个列表。第一个列表包含一些浏览器用户代理,第二个列表包含这些浏览器的版本。我只想过滤掉那些版本大于60的用户代理。在

以下是我的列表理解效果:

[link for ver in version for link in useragents if ver > 60]

这个列表的问题是它多次打印同一个用户代理。我使用zip函数编写了以下代码,该函数运行良好:

^{pr2}$

为什么我的列表理解返回意外结果?在


Tags: 函数用户in版本代理列表forif
3条回答
[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),也就是说,您正在迭代versionuseragents的每个组合。这不是您想要的,假设您的versionuseragents列表对齐。在

for循环等效的是以下列表理解:

^{pr2}$

这个

[link for ver in version for link in useragents if ver > 60]

与zip不同。它不是并行迭代两个序列。它迭代了这两个序列的所有组合。在

就好像你写了:

^{pr2}$

因此,如果两个序列的长度都是5,那么将有25个组合(其中一些组合被条件ver > 60过滤掉)。在

当你想并行地处理序列时,zip是一种方法,即使在理解中也是如此。在

[link for (link, ver) in zip(useragents, version) if ver > 60]

相关问题 更多 >