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),即你迭代的每个组合的version和useragents.这不是你想要的,假设你version和useragents列表是对齐的.
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)
您仍然需要将两个列表压缩在一起.
这个
[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)
| 归档时间: |
|
| 查看次数: |
1886 次 |
| 最近记录: |