我有一个字典params_dict,可用来使用urllib请求和解析为url字符串生成查询参数。它工作正常,并且当我调整参数时,我只是.dict(.dict)复制并使用.update()更新相关的键/值对。
params_dict = {'mt':0, 'age':1, 'sex':1, 'color':red, 'year':2008, 'division':&}
但是,这似乎很笨拙。一些键值对保持不变,例如“ mt”,“ division”,但是对于其他键,值可以来自以下列表:
params_dict = {'mt':0, 'age':[1,2,3,4,5,6] 'sex':1, 'color':['red', 'green', 'blue', 'purple'], 'year':[2008, 2009, 2010, 2011, 2012, 2013, 2014], 'division':&}
我想做的是生成参数的所有组合,这些参数需要生成url的查询部分并将其转储到列表中,然后使用for循环来请求该列表中的url链接。
所以某些组合看起来像:
combo1_dict = {'mt':0, 'age':1, 'sex':1, 'color':'green', 'year':2008, 'division':&}
combo2_dict = {'mt':0, 'age':1 'sex':1, 'color':'blue', 'year':2008, 'division':&}
....等等。我曾尝试过使用itertools.combinations(Getting all combinations of key/value pairs in Python dict),但我不太清楚。
任何建议/指导将不胜感激!!!!
答案 0 :(得分:1)
您非常接近。 itertools.combinations()
用于在单个列表中获取所有可能的项目组合。但是,您希望所有列表中项目的所有可能组合,以便每个列表仅贡献一个项目。
解决方案是itertools.product()
:
输入可迭代项的笛卡尔积。
大致等同于生成器表达式中的嵌套for循环。例如,
product(A, B)
返回的内容与((x,y) for x in A for y in B)
相同。
因此,对于您的urllib示例:
import itertools
ages = [1,2,3,4,5,6] #all possible ages
colors = ['red', 'green', 'blue', 'purple'] #all possible colors
years = [2008, 2009, 2010, 2011, 2012, 2013, 2014] #all possible years
param_dicts = []
for age, color, years in itertools.product(ages,colors,years):
#for all possible combinations of ages, colors, and years
param_dicts.append({'mt':0, 'age':age, 'sex':1, 'color':color, 'year':year, 'division':&})
或作为列表理解:
param_dicts = [{'mt':0, 'age':age, 'sex':1, 'color':color, 'year':year, 'division':&} for age, color, years in itertools.product(ages,colors,years)]