Python中map结合lambda、repeat实现每200个URL切换文件
问题原因
原代码逻辑错误点:map(lambda x: repeat(x, 200), files) 生成的是一组独立的repeat迭代器,map在传参时会直接把每个迭代器对象整体传给tmp的file形参,不会把这些迭代器内部的重复元素展开成连续的文件序列,自然无法实现每200个URL切换一次文件的匹配规则。
实现代码
用itertools.chain.from_iterable把每个文件对应的200次重复序列拼接成连续的长序列,即可和URL列表按位置一一对应:
from itertools import repeat, chain url_list = [] # 长度88000的URL列表 files = [] # 长度50的文件列表 def tmp(url, file): return url, file # 构造匹配用的文件序列:每个文件连续重复200次,按顺序拼接 file_iter = chain.from_iterable(repeat(f, 200) for f in files) result = list(map(tmp, url_list, file_iter))
补充说明:50个文件每个使用200次,总共只能覆盖10000条URL。如果需要处理完全部88000条URL,可以循环复用文件列表,替换文件序列的构造逻辑即可,需要额外导入
cycle:from itertools import repeat, chain, cycle # 循环轮询文件列表,每个文件用200次,直到覆盖所有URL file_iter = chain.from_iterable(repeat(f, 200) for f in cycle(files))
逻辑验证
用小样本测试即可确认匹配规则符合预期:
- 测试URL列表取401个元素:
url_list = [f"url{i}" for i in range(1, 402)] - 测试文件列表取3个元素:
files = ["file1", "file2", "file3"]
运行后返回结果的匹配规则为: - 第1到200条URL匹配file1
- 第201到400条URL匹配file2
- 第401条URL匹配file3
和需求完全一致。
内容的提问来源于stack exchange,提问作者Xus。
相关产品推荐
相关产品推荐

