如何基于与键关联的值列表创建字典?

时间:2018-07-27 02:28:17

标签: python list dictionary itertools

我有一个字典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),但我不太清楚。

任何建议/指导将不胜感激!!!!

1 个答案:

答案 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)]