Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何基于与键关联的值列表创建字典?_Python_List_Dictionary_Itertools - Fatal编程技术网

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

Python 如何基于与键关联的值列表创建字典?,python,list,dictionary,itertools,Python,List,Dictionary,Itertools,我有一个字典params_dict,我正在使用它来使用urllib请求和解析为url字符串生成查询参数。它工作正常,当我调整参数时,我只需.copy()dict并使用.update()更新相关的键/值对 然而,这似乎很笨拙。某些键值对与“mt”、“division”的键值对相同,但对于其他键值,其值可以来自如下列表: params_dict = {'mt':0, 'age':[1,2,3,4,5,6] 'sex':1, 'color':['red', 'green', 'blue', 'purp

我有一个字典params_dict,我正在使用它来使用urllib请求和解析为url字符串生成查询参数。它工作正常,当我调整参数时,我只需.copy()dict并使用.update()更新相关的键/值对

然而,这似乎很笨拙。某些键值对与“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.combines(),但我还是不太明白

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

你很接近。用于在单个列表中获取所有可能的项目组合。但是,您需要多个列表中所有可能的项目组合,以便每个列表只贡献一个项目

解决办法是:

输入变量的笛卡尔积

大致相当于生成器表达式中的嵌套for循环。例如,
产品(A,B)
返回的值与
相同(A中x的(x,y)表示B中y的值)

因此,对于您的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)]

您的用例是什么?传递多个年龄的列表(在查询字符串中表示为
?年龄=1&age=2
)是一种有效且常见的方法。
param_dicts = [{'mt':0, 'age':age, 'sex':1, 'color':color, 'year':year, 'division':&} for age, color, years in itertools.product(ages,colors,years)]