【发布时间】:2017-10-26 14:40:01
【问题描述】:
我有一个这样的字典:
config = {
'CONF_A': ['a1', 'a2', 'a3'],
'CONF_B': ['b1', 'b2'],
'CONF_C': {
'CONF_C1': ['c1'],
'CONF_C2': ['c21','c22']
}
}
我需要枚举 CONF_A 和 CONF_B 的所有值,首先使用 CONF_C1 中的所有值,然后使用 CONF_C2 中的所有值。例如:
('a1', 'b1', 'c1')
('a1', 'b2', 'c1')
('a2', 'b1', 'c1')
('a2', 'b2', 'c1')
('a3', 'b1', 'c1')
('a3', 'b2', 'c1')
.... same for 'c21'
.... same for 'c22'
我也需要拥有这些的钥匙。我可以为仅包含 CONF_A 和 CONF_B 的配置获取此信息(见下文),但我不确定如何枚举每个 CONF_C 元素。
>>> for x in itertools.product(*conf.itervalues()):
for k, v in itertools.izip(conf,x):
print k,v
...
CONF_A a1
CONF_B b1
CONF_A a1
CONF_B b2
CONF_A a2
CONF_B b1
CONF_A a2
CONF_B b2
CONF_A a3
CONF_B b1
CONF_A a3
CONF_B b2
注意CONF_C 元素的键应该是 'CONF_C1' 和 'CONF_C2'
----编辑----
@Patrick.Haugh 为问题的第一部分提供了这个答案:
for x in product(config['CONF_A'], config['CONF_B'], chain.from_iterable(config['CONF_C'].values())):
这适用于获取笛卡尔积,但是我仍然需要重新输入密钥。当我执行以下操作时:
for k, v in itertools.izip(config, x):
我得到了键 CONF_A、CONF_B 和 CONF_C。然而,这些值是相反的顺序,例如
{'CONF_A': c1, 'CONF_B': b1, 'CONF_C': 'a1'}
此外,我正在尝试弄清楚如何确保 C 的键与 CONF_C 值匹配,即
{'CONF_A': a1, 'CONF_B': b1, 'CONF_C1': 'c1'}
{'CONF_A': a1, 'CONF_B': b1, 'CONF_C2': 'c21'}
【问题讨论】:
标签: python iteration enumeration itertools