2017-10-26 24 views
1

파이썬 딕셔너리의 모든 요소들을 열거 CONF_C2의 값 예 :조건부 I는 등의 딕셔너리가

('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 (아래 참조)로 구성된 config에 대해이 값을 얻을 수 있지만 각 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 

N.B.

: CONF_C 요소에 대한 키는 Patrick.Haugh @ 질문의 첫 번째 부분이 답을 제공

'CONF_C1'와 'CONF_C2'

---- 편집 ----해야

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'} 

또한, 내가 확인하는 방법을 알아 내려고 노력하고있어 그 위로 CONF_C 값이 C 일치, 즉의 키

{'CONF_A': a1, 'CONF_B': b1, 'CONF_C1': 'c1'} 
{'CONF_A': a1, 'CONF_B': b1, 'CONF_C2': 'c21'} 

답변

4

사용 itertools.productitertools.chain

from itertools import product, chain 

list(product(config['CONF_A'], config['CONF_B'], chain.from_iterable(config['CONF_C'].values()))) 

우리에게 준다

[('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')) 
+0

감사를 제공합니다. 모든 열거 형에서 작동하지만 키를 다시 가져 오려고합니다. 자세한 내용은 * edit *를 참조하십시오. – mbadd

+0

@ 마이클 내 편집 참조 –