在python中有条件地枚举dict的所有元素

在python中有条件地枚举dict的所有元素,python,iteration,enumeration,itertools,Python,Iteration,Enumeration,Itertools,我有这样一句话: config = { 'CONF_A': ['a1', 'a2', 'a3'], 'CONF_B': ['b1', 'b2'], 'CONF_C': { 'CONF_C1': ['c1'], 'CONF_C2': ['c21','c22'] } } 我需要枚举CONF_A和C

我有这样一句话:

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中的所有值。e、 g:

('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'}
配合使用

给我们

[('a1', 'b1', 'c1'), ('a1', 'b1', 'c21'), ('a1', 'b1', 'c22'), ('a1', 'b2', 'c1'), 
 ('a1', 'b2', 'c21'), ('a1', 'b2', 'c22'), ('a2', 'b1', 'c1'), ('a2', 'b1', 'c21'), 
 ('a2', 'b1', 'c22'), ('a2', 'b2', 'c1'), ('a2', 'b2', 'c21'), ('a2', 'b2', 'c22'), 
 ('a3', 'b1', 'c1'), ('a3', 'b1', 'c21'), ('a3', 'b1', 'c22'), ('a3', 'b2', 'c1'), 
 ('a3', 'b2', 'c21'), ('a3', 'b2', 'c22')]
编辑:

a_gen = (('CONF_A', a) for a in config['CONF_A'])
b_gen = (('CONF_B', b) for b in config['CONF_B'])
c_gen = ((k, e) for k, v in config['CONF_C'].items() for e in v)
for i in product(a_gen, b_gen, c_gen):
    print(i)
给我们

(('CONF_A', 'a1'), ('CONF_B', 'b1'), ('CONF_C1', 'c1'))
(('CONF_A', 'a1'), ('CONF_B', 'b1'), ('CONF_C2', 'c21'))
(('CONF_A', 'a1'), ('CONF_B', 'b1'), ('CONF_C2', 'c22'))
(('CONF_A', 'a1'), ('CONF_B', 'b2'), ('CONF_C1', 'c1'))
(('CONF_A', 'a1'), ('CONF_B', 'b2'), ('CONF_C2', 'c21'))
(('CONF_A', 'a1'), ('CONF_B', 'b2'), ('CONF_C2', 'c22'))
(('CONF_A', 'a2'), ('CONF_B', 'b1'), ('CONF_C1', 'c1'))
(('CONF_A', 'a2'), ('CONF_B', 'b1'), ('CONF_C2', 'c21'))
(('CONF_A', 'a2'), ('CONF_B', 'b1'), ('CONF_C2', 'c22'))
(('CONF_A', 'a2'), ('CONF_B', 'b2'), ('CONF_C1', 'c1'))
(('CONF_A', 'a2'), ('CONF_B', 'b2'), ('CONF_C2', 'c21'))
(('CONF_A', 'a2'), ('CONF_B', 'b2'), ('CONF_C2', 'c22'))
(('CONF_A', 'a3'), ('CONF_B', 'b1'), ('CONF_C1', 'c1'))
(('CONF_A', 'a3'), ('CONF_B', 'b1'), ('CONF_C2', 'c21'))
(('CONF_A', 'a3'), ('CONF_B', 'b1'), ('CONF_C2', 'c22'))
(('CONF_A', 'a3'), ('CONF_B', 'b2'), ('CONF_C1', 'c1'))
(('CONF_A', 'a3'), ('CONF_B', 'b2'), ('CONF_C2', 'c21'))
(('CONF_A', 'a3'), ('CONF_B', 'b2'), ('CONF_C2', 'c22'))
配合使用

给我们

[('a1', 'b1', 'c1'), ('a1', 'b1', 'c21'), ('a1', 'b1', 'c22'), ('a1', 'b2', 'c1'), 
 ('a1', 'b2', 'c21'), ('a1', 'b2', 'c22'), ('a2', 'b1', 'c1'), ('a2', 'b1', 'c21'), 
 ('a2', 'b1', 'c22'), ('a2', 'b2', 'c1'), ('a2', 'b2', 'c21'), ('a2', 'b2', 'c22'), 
 ('a3', 'b1', 'c1'), ('a3', 'b1', 'c21'), ('a3', 'b1', 'c22'), ('a3', 'b2', 'c1'), 
 ('a3', 'b2', 'c21'), ('a3', 'b2', 'c22')]
编辑:

a_gen = (('CONF_A', a) for a in config['CONF_A'])
b_gen = (('CONF_B', b) for b in config['CONF_B'])
c_gen = ((k, e) for k, v in config['CONF_C'].items() for e in v)
for i in product(a_gen, b_gen, c_gen):
    print(i)
给我们

(('CONF_A', 'a1'), ('CONF_B', 'b1'), ('CONF_C1', 'c1'))
(('CONF_A', 'a1'), ('CONF_B', 'b1'), ('CONF_C2', 'c21'))
(('CONF_A', 'a1'), ('CONF_B', 'b1'), ('CONF_C2', 'c22'))
(('CONF_A', 'a1'), ('CONF_B', 'b2'), ('CONF_C1', 'c1'))
(('CONF_A', 'a1'), ('CONF_B', 'b2'), ('CONF_C2', 'c21'))
(('CONF_A', 'a1'), ('CONF_B', 'b2'), ('CONF_C2', 'c22'))
(('CONF_A', 'a2'), ('CONF_B', 'b1'), ('CONF_C1', 'c1'))
(('CONF_A', 'a2'), ('CONF_B', 'b1'), ('CONF_C2', 'c21'))
(('CONF_A', 'a2'), ('CONF_B', 'b1'), ('CONF_C2', 'c22'))
(('CONF_A', 'a2'), ('CONF_B', 'b2'), ('CONF_C1', 'c1'))
(('CONF_A', 'a2'), ('CONF_B', 'b2'), ('CONF_C2', 'c21'))
(('CONF_A', 'a2'), ('CONF_B', 'b2'), ('CONF_C2', 'c22'))
(('CONF_A', 'a3'), ('CONF_B', 'b1'), ('CONF_C1', 'c1'))
(('CONF_A', 'a3'), ('CONF_B', 'b1'), ('CONF_C2', 'c21'))
(('CONF_A', 'a3'), ('CONF_B', 'b1'), ('CONF_C2', 'c22'))
(('CONF_A', 'a3'), ('CONF_B', 'b2'), ('CONF_C1', 'c1'))
(('CONF_A', 'a3'), ('CONF_B', 'b2'), ('CONF_C2', 'c21'))
(('CONF_A', 'a3'), ('CONF_B', 'b2'), ('CONF_C2', 'c22'))

谢谢你的回答。它适用于所有的枚举,但是我也在寻找返回的键-有关详细信息,请参阅编辑。谢谢你的回答。它适用于所有的枚举,但是我也希望能重新获得密钥-有关详细信息,请参见编辑。