python中的乘法字符串向量

python中的乘法字符串向量,python,Python,我有动态数量的字符串向量,我需要将它们相乘,并创建一个dict数组,将所有可能的结果结合起来 如果输入是静态的,我会这样做: sth = { "param1": ["p1v1", "p1v2"], "param2": ["p2v1", "p2v2", "p2v3"], "param3": ["p3v1&q

我有动态数量的字符串向量,我需要将它们相乘,并创建一个dict数组,将所有可能的结果结合起来

如果输入是静态的,我会这样做:

sth = {
    "param1": ["p1v1", "p1v2"],
    "param2": ["p2v1", "p2v2", "p2v3"],
    "param3": ["p3v1", "p3v2"]
}

param_sets = []

for a_top_val in sth["param1"]:
    for a_val in sth["param2"]:
        for a_bottom_val in sth["param3"]:
            param_sets.append({
                "param1": a_top_val,
                "param2": a_val,
                "param3": a_bottom_val
            })

print(param_sets)
print(len(param_sets))
[
    {'param1': 'p1v1', 'param2': 'p2v1', 'param3': 'p3v1'},
    {'param1': 'p1v1', 'param2': 'p2v1', 'param3': 'p3v2'},
    {'param1': 'p1v1', 'param2': 'p2v2', 'param3': 'p3v1'},
    {'param1': 'p1v1', 'param2': 'p2v2', 'param3': 'p3v2'},
    {'param1': 'p1v1', 'param2': 'p2v3', 'param3': 'p3v1'},
    {'param1': 'p1v1', 'param2': 'p2v3', 'param3': 'p3v2'},
    {'param1': 'p1v2', 'param2': 'p2v1', 'param3': 'p3v1'},
    {'param1': 'p1v2', 'param2': 'p2v1', 'param3': 'p3v2'},
    {'param1': 'p1v2', 'param2': 'p2v2', 'param3': 'p3v1'},
    {'param1': 'p1v2', 'param2': 'p2v2', 'param3': 'p3v2'},
    {'param1': 'p1v2', 'param2': 'p2v3', 'param3': 'p3v1'},
    {'param1': 'p1v2', 'param2': 'p2v3', 'param3': 'p3v2'}
]
这将打印组合的dict,如下所示:

sth = {
    "param1": ["p1v1", "p1v2"],
    "param2": ["p2v1", "p2v2", "p2v3"],
    "param3": ["p3v1", "p3v2"]
}

param_sets = []

for a_top_val in sth["param1"]:
    for a_val in sth["param2"]:
        for a_bottom_val in sth["param3"]:
            param_sets.append({
                "param1": a_top_val,
                "param2": a_val,
                "param3": a_bottom_val
            })

print(param_sets)
print(len(param_sets))
[
    {'param1': 'p1v1', 'param2': 'p2v1', 'param3': 'p3v1'},
    {'param1': 'p1v1', 'param2': 'p2v1', 'param3': 'p3v2'},
    {'param1': 'p1v1', 'param2': 'p2v2', 'param3': 'p3v1'},
    {'param1': 'p1v1', 'param2': 'p2v2', 'param3': 'p3v2'},
    {'param1': 'p1v1', 'param2': 'p2v3', 'param3': 'p3v1'},
    {'param1': 'p1v1', 'param2': 'p2v3', 'param3': 'p3v2'},
    {'param1': 'p1v2', 'param2': 'p2v1', 'param3': 'p3v1'},
    {'param1': 'p1v2', 'param2': 'p2v1', 'param3': 'p3v2'},
    {'param1': 'p1v2', 'param2': 'p2v2', 'param3': 'p3v1'},
    {'param1': 'p1v2', 'param2': 'p2v2', 'param3': 'p3v2'},
    {'param1': 'p1v2', 'param2': 'p2v3', 'param3': 'p3v1'},
    {'param1': 'p1v2', 'param2': 'p2v3', 'param3': 'p3v2'}
]

如何使for循环围绕
sth
动态进行?

在python中循环字典,您可以使用

for k, v in sth:
    print (k, v)

要在python中循环字典,可以使用

for k, v in sth:
    print (k, v)
使用的组合获取所有可能值的组合,并将键重新应用于元组:

from itertools import product

sth = {
    "param1": ["p1v1", "p1v2"],
    "param2": ["p2v1", "p2v2", "p2v3"],
    "param3": ["p3v1", "p3v2"]
}

prod = product(*(sth[k] for k in sth))
a = [dict(zip(sth.keys(), p)) for p in prod]

print(a)
要获得:

[{'param1': 'p1v1', 'param2': 'p2v1', 'param3': 'p3v1'},
{'param1': 'p1v1', 'param2': 'p2v1', 'param3': 'p3v2'},
{'param1': 'p1v1', 'param2': 'p2v2', 'param3': 'p3v1'},
{'param1': 'p1v1', 'param2': 'p2v2', 'param3': 'p3v2'},
{'param1': 'p1v1', 'param2': 'p2v3', 'param3': 'p3v1'},
{'param1': 'p1v1', 'param2': 'p2v3', 'param3': 'p3v2'},
{'param1': 'p1v2', 'param2': 'p2v1', 'param3': 'p3v1'},
{'param1': 'p1v2', 'param2': 'p2v1', 'param3': 'p3v2'},
{'param1': 'p1v2', 'param2': 'p2v2', 'param3': 'p3v1'},
{'param1': 'p1v2', 'param2': 'p2v2', 'param3': 'p3v2'},
{'param1': 'p1v2', 'param2': 'p2v3', 'param3': 'p3v1'},
{'param1': 'p1v2', 'param2': 'p2v3', 'param3': 'p3v2'}]
使用的组合获取所有可能值的组合,并将键重新应用于元组:

from itertools import product

sth = {
    "param1": ["p1v1", "p1v2"],
    "param2": ["p2v1", "p2v2", "p2v3"],
    "param3": ["p3v1", "p3v2"]
}

prod = product(*(sth[k] for k in sth))
a = [dict(zip(sth.keys(), p)) for p in prod]

print(a)
要获得:

[{'param1': 'p1v1', 'param2': 'p2v1', 'param3': 'p3v1'},
{'param1': 'p1v1', 'param2': 'p2v1', 'param3': 'p3v2'},
{'param1': 'p1v1', 'param2': 'p2v2', 'param3': 'p3v1'},
{'param1': 'p1v1', 'param2': 'p2v2', 'param3': 'p3v2'},
{'param1': 'p1v1', 'param2': 'p2v3', 'param3': 'p3v1'},
{'param1': 'p1v1', 'param2': 'p2v3', 'param3': 'p3v2'},
{'param1': 'p1v2', 'param2': 'p2v1', 'param3': 'p3v1'},
{'param1': 'p1v2', 'param2': 'p2v1', 'param3': 'p3v2'},
{'param1': 'p1v2', 'param2': 'p2v2', 'param3': 'p3v1'},
{'param1': 'p1v2', 'param2': 'p2v2', 'param3': 'p3v2'},
{'param1': 'p1v2', 'param2': 'p2v3', 'param3': 'p3v1'},
{'param1': 'p1v2', 'param2': 'p2v3', 'param3': 'p3v2'}]

您可以将
sth
中的每个条目转换为键值元组列表。然后,您可以使用获取所有列表的笛卡尔乘积,并使用该乘积创建参数字典:

import itertools as it

sth = {
    "param1": ["p1v1", "p1v2"],
    "param2": ["p2v1", "p2v2", "p2v3"],
    "param3": ["p3v1", "p3v2"]
}

param_tuples = (
    [(param, val) for val in values] for param, values in sth.items()
)

result = [
    dict(param_combination) for param_combination in it.product(*param_tuples)
]
结果:

[{'param1': 'p1v1', 'param2': 'p2v1', 'param3': 'p3v1'},
 {'param1': 'p1v1', 'param2': 'p2v1', 'param3': 'p3v2'},
 {'param1': 'p1v1', 'param2': 'p2v2', 'param3': 'p3v1'},
 {'param1': 'p1v1', 'param2': 'p2v2', 'param3': 'p3v2'},
 {'param1': 'p1v1', 'param2': 'p2v3', 'param3': 'p3v1'},
 {'param1': 'p1v1', 'param2': 'p2v3', 'param3': 'p3v2'},
 {'param1': 'p1v2', 'param2': 'p2v1', 'param3': 'p3v1'},
 {'param1': 'p1v2', 'param2': 'p2v1', 'param3': 'p3v2'},
 {'param1': 'p1v2', 'param2': 'p2v2', 'param3': 'p3v1'},
 {'param1': 'p1v2', 'param2': 'p2v2', 'param3': 'p3v2'},
 {'param1': 'p1v2', 'param2': 'p2v3', 'param3': 'p3v1'},
 {'param1': 'p1v2', 'param2': 'p2v3', 'param3': 'p3v2'}]

您可以将
sth
中的每个条目转换为键值元组列表。然后,您可以使用获取所有列表的笛卡尔乘积,并使用该乘积创建参数字典:

import itertools as it

sth = {
    "param1": ["p1v1", "p1v2"],
    "param2": ["p2v1", "p2v2", "p2v3"],
    "param3": ["p3v1", "p3v2"]
}

param_tuples = (
    [(param, val) for val in values] for param, values in sth.items()
)

result = [
    dict(param_combination) for param_combination in it.product(*param_tuples)
]
结果:

[{'param1': 'p1v1', 'param2': 'p2v1', 'param3': 'p3v1'},
 {'param1': 'p1v1', 'param2': 'p2v1', 'param3': 'p3v2'},
 {'param1': 'p1v1', 'param2': 'p2v2', 'param3': 'p3v1'},
 {'param1': 'p1v1', 'param2': 'p2v2', 'param3': 'p3v2'},
 {'param1': 'p1v1', 'param2': 'p2v3', 'param3': 'p3v1'},
 {'param1': 'p1v1', 'param2': 'p2v3', 'param3': 'p3v2'},
 {'param1': 'p1v2', 'param2': 'p2v1', 'param3': 'p3v1'},
 {'param1': 'p1v2', 'param2': 'p2v1', 'param3': 'p3v2'},
 {'param1': 'p1v2', 'param2': 'p2v2', 'param3': 'p3v1'},
 {'param1': 'p1v2', 'param2': 'p2v2', 'param3': 'p3v2'},
 {'param1': 'p1v2', 'param2': 'p2v3', 'param3': 'p3v1'},
 {'param1': 'p1v2', 'param2': 'p2v3', 'param3': 'p3v2'}]

您是否阅读过
itertools
库?它有几种方法可以打印给定列表的所有排列。您读过
itertools
库吗?它有几种方法可以打印给定列表的所有排列。