Python 对两个列表进行迭代的列表理解未按预期工作

Python 对两个列表进行迭代的列表理解未按预期工作,python,list,for-loop,nested,list-comprehension,Python,List,For Loop,Nested,List Comprehension,我想迭代两个列表。第一个列表包含一些浏览器用户代理,第二个列表包含这些浏览器的版本。我只想过滤掉那些版本大于60的用户代理 以下是我的列表理解: [link for ver in version for link in useragents if ver > 60] 此列表的问题在于它多次打印同一个用户代理。我使用zip函数编写了以下内容,该函数运行良好: for link, ver in zip(useragents, version): if ver > 60:

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

以下是我的列表理解:

[link for ver in version for link in useragents if ver > 60]
此列表的问题在于它多次打印同一个用户代理。我使用
zip
函数编写了以下内容,该函数运行良好:

for link, ver in zip(useragents, version):
    if ver > 60:
        # append to list
        print(link)
为什么我的列表会返回意外的结果

[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
的每个组合。这不是您想要的,假设您的
版本
用户代理
列表是对齐的

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

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

在没有数据的情况下,无法确定发生了什么,但一般来说,“双”列表理解与
zip
不同,而是一个双循环,即

[a for b in bs for a in as]
相当于

for b in bs:
    for a in as:
        lst.append(a)
这个

和zip不一样。它不是并行地遍历两个序列。它迭代这两个序列的所有组合

就好像你写了:

for ver in version:
    for link in useragents:
        if ver > 60:
            # append(link)
因此,如果两个序列的长度都为5,则会有25个组合(其中一些组合会被条件
ver>60
过滤掉)

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

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

或者,您可以将该函数与
map()
结合使用,在其中检查某些条件:

from itertools import compress

filter_ = map(lambda x: x > 60, version)
list(compress(useragents, filter_))
例子:
from itertools import compress

filter_ = map(lambda x: x > 60, version)
list(compress(useragents, filter_))
s = 'ABCDEFG'
nums = range(len(s))
    
filter_ = map(lambda x: x > 3, nums)
print(list(compress(s, filter_)))
# ['E', 'F', 'G']