2017-06-11 160 views
1

我有一本字典。集合元素的组合

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

我想找到两个元素的组合,每个元素必须来自不同的dict键。

例如:('CC1', 'Ct1')是一种这样的组合,而('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')作为两个不同的组合,但我想只是其中之一。

回答

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

谢谢!这正是我想要的。 –