迭代器/发生器,用于在控制系统中产生所有可能的情况

时间:2012-01-26 17:34:12

标签: python python-3.x

这里有蟒蛇新手。我正在编写代码来控制具有多个变量的实验。变量在csv文件中定义,如:

Temp, Voltage, Pressure
23, 4.8, 19
23;28, 4.8, 19;23

我读了文件并创建了一个字典,那部分工作正常。例如,第一行将是:

{'Temp': ['23'], 'Voltage': ['4.8'], 'Pressure': ['19']}

这将控制一个实验。 第二行将是:

{'Temp': ['30', '28'], 'Voltage': ['4.8'], 'Pressure': ['19', '23']}

我想要的是从该行依次生成所有可能的词典的方法。例如,第二行将扩展到四个实验:

{'Temp': ['30'], 'Voltage': ['4.8'], 'Pressure': ['19']}
{'Temp': ['30'], 'Voltage': ['4.8'], 'Pressure': ['23']}
{'Temp': ['28'], 'Voltage': ['4.8'], 'Pressure': ['19']}
{'Temp': ['28'], 'Voltage': ['4.8'], 'Pressure': ['23']}

顺序很重要(最后一列是内循环)。我有一个列表,其中包含我想要迭代的顺序的键。例如:

('Temp', 'Voltage', 'Pressure')

在这种情况下。

这是一个过于简单化的问题,系统中存在大量变量(列)。

我正在考虑一个带有计数器的并行字典来跟踪每个变量的可能情况和当前情况,但也许我错过了在python中表达这种情况的更优雅方式。

此致

- ga

1 个答案:

答案 0 :(得分:2)

是的,你想要itertools.product()。你只需要从字典和字母中提取列表。用你的字典结构重新包装结果。

from itertools import product
def _combinations_for_record(d):
    for tmp, vlt, prs in product(d['Temp'], d['Voltage'], d['Pressure']):
        yield {"Temp": [tmp], "Voltage": [vlt], "Pressure": [prs]}