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

Vik*_*tor 15 python for-loop nested list-comprehension list

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

这是我的列表理解的样子:

[link for ver in version for link in useragents if ver > 60]
Run Code Online (Sandbox Code Playgroud)

此列表的问题是它多次打印相同的用户代理.我使用zip函数编写了以下函数,它工作正常:

for link, ver in zip(useragents, version):
    if ver > 60:
        # append to list
        print(link)
Run Code Online (Sandbox Code Playgroud)

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

jpp*_*jpp 26

您的第一个列表理解等同于:

res = []
for ver in version:
    for link in useragents:
        if ver > 60:
            res.append(link)
Run Code Online (Sandbox Code Playgroud)

请注意你嵌套循环与时间复杂度为O(ñ 2),即你迭代的每个组合versionuseragents.这不是你想要的,假设你versionuseragents列表是对齐的.

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

res = [link for link, ver in zip(useragents, version) if ver > 60]
Run Code Online (Sandbox Code Playgroud)


小智 8

[link for (link, ver) in zip(useragents, version) if ver > 60]
Run Code Online (Sandbox Code Playgroud)

您仍然需要将两个列表压缩在一起.


khe*_*ood 6

这个

[link for ver in version for link in useragents if ver > 60]
Run Code Online (Sandbox Code Playgroud)

与zip不一样.它不是并行迭代这两个序列.它正在迭代这两个序列的所有组合.

就像你写的那样:

for ver in version:
    for link in useragents:
        if ver > 60:
            # append(link)
Run Code Online (Sandbox Code Playgroud)

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

当你想要并行浏览序列zip时,即使是在理解中也是如此.

[link for (link, ver) in zip(useragents, version) if ver > 60]
Run Code Online (Sandbox Code Playgroud)