给出这样一本词典,有些条目是元组...

params = {
 'a': 'static',
 'b': (1, 2),
 'c': ('X', 'Y')
}

我需要的项目的"产品"到一个像这样的字典列表,与元组展开,以便在b中的每一项将匹配在c中的每一项…

[{ 'a': 'static', 'b': 1, 'c': 'X' },
 { 'a': 'static', 'b': 1, 'c': 'Y' },
 { 'a': 'static', 'b': 2, 'c': 'X' },
 { 'a': 'static', 'b': 2, 'c': 'Y')}]

我可以很容易地将初始输入分为非元组项和元组项的列表,并在乘法之前将每个元组的键作为"标签"应用于值,因此它们看起来像这样:'b##1', 'b##2', 'c##X', 'c##Y'.然后在乘法后将它们解析回上面的dict.如果我总是看到2个元组项(如b和c),我可以很容易地将两者都传递给itertools.products.但可能有0.. n元组项,product()不会以这种方式乘以列表的列表.有人能想到解决办法吗?

TAG = '##'      
# separate tuples and non-tuples from the input, and prepend the key of each tuple as a tag on the value to parse out later
for key, value in params.items():
    if type(value) is tuple:
        for x in value:
            tuples.append(f'{key}{TAG}{x}')
    else:
        non_tuples.append({key: value})
print(list(product(tuples))      # BUG: doesn't distribute each value of b with each value of c

推荐答案

product接受多个迭代量,但要记住的关键一点是,一个迭代量可以包含单个项.如果原始DICT中的值不是元组(或列表),则需要将其转换为包含单个值的元组并将其传递给product:

params_iterables = {}
for k, v in params.items():
    if isinstance(v, (tuple, list)):
        params_iterables[k] = v     # v is already a tuple or a list
    else:
        params_iterables[k] = (v, ) # A tuple containing a single value, v

其给出:

params_iterables = {'a': ('static',), 'b': (1, 2), 'c': ('X', 'Y')}

然后,只需获得params_iterables中值的乘积:

result = []
for values in product(*params_iterables.values()):
    result.append(dict(zip(params, values)))

dict(zip(params, values))行创建一个dict,其中values的第一个元素被分配给params中的第一个键,依此类推.然后将此字典附加到result,它给出了所需的输出:

[{'a': 'static', 'b': 1, 'c': 'X'},
 {'a': 'static', 'b': 1, 'c': 'Y'},
 {'a': 'static', 'b': 2, 'c': 'X'},
 {'a': 'static', 'b': 2, 'c': 'Y'}]

Python相关问答推荐

配置Sweetviz以分析对象类型列,而无需转换

Pandas 第二小值有条件

如何比较numPy数组中的两个图像以获取它们不同的像素

无法通过python-jira访问jira工作日志(log)中的 comments

如何使用它?

所有列的滚动标准差,忽略NaN

连接一个rabrame和另一个1d rabrame不是问题,但当使用[...]'运算符会产生不同的结果

当递归函数的返回值未绑定到变量时,非局部变量不更新:

Plotly Dash Creating Interactive Graph下拉列表

在Admin中显示从ManyToMany通过模型的筛选结果

使用Python异步地持久跟踪用户输入

递归函数修饰器

如何合并具有相同元素的 torch 矩阵的行?

数据框,如果值在范围内,则获取范围和

如何为需要初始化的具体类实现依赖反转和接口分离?

Matplotlib中的曲线箭头样式

具有不匹配列的2D到3D广播

如何在Polars中将列表中的新列添加到现有的数据帧中?

来自任务调度程序的作为系统的Python文件

合并Pandas中的数据帧,但处理不存在的列