Python 对两个列表进行迭代的列表理解未按预期工作
我想迭代两个列表。第一个列表包含一些浏览器用户代理,第二个列表包含这些浏览器的版本。我只想过滤掉那些版本大于60的用户代理 以下是我的列表理解: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:
[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']