简体   繁体   English

在python中乘以字符串向量

[英]Multiply string vectors in python

I have dynamic number of string vectors, which I need to multiply and create an array of dicts combining all possibilities.我有动态数量的字符串向量,我需要将它们相乘并创建一个组合所有可能性的字典数组。

If the input were static, I would do it like this:如果输入是静态的,我会这样做:

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))

This prints the combined dicts like this:这会打印这样的组合字典:

[
    {'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'}
]

How do I make the for loops around sth dynamic?我如何使sth周围的 for 循环动态化?

Use a combination of itertools.product to get all combinations of possible values and zip() to reapply the keys to the tuples:使用itertools.product的组合来获取可能值的所有组合,并使用zip()将键重新应用于元组:

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)

to get:要得到:

[{'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'}]

You can turn every entry in sth into a list of key-value tuples.您可以将sth每个条目转换为键值元组列表。 Then you can use itertools.product to get the cartesian product of all lists and use that to create your param dictionaries:然后您可以使用itertools.product获取所有列表的笛卡尔积并使用它来创建您的参数字典:

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

result:结果:

[{'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'}]

To loop dictionaries in python you can use要在 python 中循环字典,您可以使用

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM