2017-06-11 12 views
1

私は辞書を持っています。セットの要素の組み合わせ

d = { 
    'Cause Class': {'CC1', 'CC2'}, 
    'Cause Type': {'Ct1', 'Ct2', 'Ct3', 'Ct4'}, 
    'Incident Type': {'It1', 'It2', 'It3'} 
} 

私は、各要素がdictの異なるキーからのものでなければならない2つの要素の組み合わせを探したいと思います。

例えば、('CC1', 'Ct1')はそのような組み合わせの1つであるのに対して、('Ct1', 'Ct2')はそうではありません。

私はこの

ksgg = [] 
for i in d: 
    #print(i) 
    for j in d: 
     if i != j: 
      ksgg.append(list(set(it.product(d[i],d[j])))) 

を試してみましたが、それは二つの異なる組み合わせとして('CC1', 'Ct1')('Ct1', 'CC1')を与えているが、私はそれらを1つだけ欲しいです。

答えて

2

キーの上にネストされたループの代わりに、すべての値をitertools.combinations()に渡します。 、次の組み合わせが作成され、あなたの特定の辞書のために

from itertools import combinations, product 

ksgg = [] 
for set1, set2 in combinations(d.values(), 2): 
    ksgg += product(set1, set2) 

>>> from itertools import combinations, product 
>>> for set1, set2 in combinations(d, 2): 
...  print(set1, set2, sep=' - ') 
... 
Cause Class - Cause Type 
Cause Class - Incident Type 
Cause Type - Incident Type 

ペアリングの正確な順序は辞書順に基づいて異なり、それは、与えられた長さのユニークな組み合わせを選ぶでしょう。

全デモ:

>>> ksgg = [] 
>>> for set1, set2 in combinations(d.values(), 2): 
...  ksgg += product(set1, set2) 
... 
>>> from pprint import pprint 
>>> pprint(ksgg) 
[('CC1', 'Ct4'), 
('CC1', 'Ct2'), 
('CC1', 'Ct1'), 
('CC1', 'Ct3'), 
('CC2', 'Ct4'), 
('CC2', 'Ct2'), 
('CC2', 'Ct1'), 
('CC2', 'Ct3'), 
('CC1', 'It2'), 
('CC1', 'It1'), 
('CC1', 'It3'), 
('CC2', 'It2'), 
('CC2', 'It1'), 
('CC2', 'It3'), 
('Ct4', 'It2'), 
('Ct4', 'It1'), 
('Ct4', 'It3'), 
('Ct2', 'It2'), 
('Ct2', 'It1'), 
('Ct2', 'It3'), 
('Ct1', 'It2'), 
('Ct1', 'It1'), 
('Ct1', 'It3'), 
('Ct3', 'It2'), 
('Ct3', 'It1'), 
('Ct3', 'It3')] 
+0

ありがとう!これはまさに私が望んでいたものです。 –

関連する問題