2012-12-27 17 views
1

朋友,基本上,我想帶一個字典:由具有不同密鑰的所有值之間的所有可能的排列如何從字典中的每個值列表中選擇一個項目的所有排列?

fruit_dict = {'oranges':['big','small'],'apples':['green','yellow','red']} 

,並獲得以下詞典的清單:

output_list = 
[ 
{'oranges':'big','apples':'green'}, 
{'oranges':'big','apples':'yellow'}, 
{'oranges':'big','apples':'red'}, 
{'oranges':'small','apples':'green'}, 
{'oranges':'small','apples':'yellow'}, 
{'oranges':'small','apples':'red'} 
] 

怎麼做?太感謝了!

回答

8

你要找的不是排列,而是Cartesian product。把它想象成一個嵌套循環。

from itertools import product 

fruit_dict = {'oranges':['big','small'],'apples':['green','yellow','red']}  

keys, values = zip(*fruit_dict.items()) 
print [dict(zip(keys, value_list)) for value_list in product(*values)] 

然後,您只需要使用現有密鑰和產品中的每個項目創建一個新字典。

+1

非常感謝,AGF!按需要工作。 –

0

使用itertools.product()

In [94]: dic = {'oranges':['big','small'],'apples':['green','yellow','red']} 

In [95]: sort_values=[x[1] for x in sorted(dic.items())] #sorted values based on keys 

In [96]: [dict(zip(sorted(dic.keys()),x)) for x in product(*sort_values)] 
Out[96]: 
[{'apples': 'green', 'oranges': 'big'}, 
{'apples': 'green', 'oranges': 'small'}, 
{'apples': 'yellow', 'oranges': 'big'}, 
{'apples': 'yellow', 'oranges': 'small'}, 
{'apples': 'red', 'oranges': 'big'}, 
{'apples': 'red', 'oranges': 'small'}] 
相關問題