Obtención de todas las combinaciones de pares clave / valor en el dictado de Python

Esta puede ser una pregunta tonta, pero dado el siguiente dictamen:

combination_dict = {"one": [1, 2, 3], "two": [2, 3, 4], "three": [3, 4, 5]} 

¿Cómo lograría esta lista?

 result_list = [{"one": [1, 2, 3], "two": [2, 3, 4]}, {"one": [1, 2, 3], "three": [3, 4, 5]}, {"two": [2, 3, 4], "three": [3, 4, 5]}] 

En otras palabras, quiero todas las combinaciones de dos pares clave / valor en un dict sin reemplazo, independientemente del orden.

Una solución es usar itertools.combinations() :

 result_list = map(dict, itertools.combinations( combination_dict.iteritems(), 2)) 

Edición : Debido a la demanda popular , aquí una versión de Python 3.x:

 result_list = list(map(dict, itertools.combinations( combination_dict.items(), 2))) 

Prefiero la solución de @JollyJumper para facilitar la lectura, aunque esta funciona más rápido.

 >>> from itertools import combinations >>> d = {"one": [1, 2, 3], "two": [2, 3, 4], "three": [3, 4, 5]} >>> [{j: d[j] for j in i} for i in combinations(d, 2)] [{'three': [3, 4, 5], 'two': [2, 3, 4]}, {'three': [3, 4, 5], 'one': [1, 2, 3]}, {'two': [2, 3, 4], 'one': [1, 2, 3]}] 

Tiempos:

 >python -m timeit -s "d = {'three': [3, 4, 5], 'two': [2, 3, 4], 'one': [1, 2, 3]}; from itertools import combinations" "map(dict, combinations(d.iteritems(), 2))" 100000 loops, best of 3: 3.27 usec per loop >python -m timeit -s "d = {'three': [3, 4, 5], 'two': [2, 3, 4], 'one': [1, 2, 3]}; from itertools import combinations" "[{j: d[j] for j in i} for i in combinations(d, 2)]" 1000000 loops, best of 3: 1.92 usec per loop 
 from itertools import combinations combination_dict = {"one": [1, 2, 3], "two": [2, 3, 4], "three": [3, 4, 5]} lis=[] for i in range(1,len(combination_dict)): for x in combinations(combination_dict,i): dic={z:combination_dict[z] for z in x} lis.append(dic) print lis 

salida:

 [{'three': [3, 4, 5]}, {'two': [2, 3, 4]}, {'one': [1, 2, 3]}, {'three': [3, 4, 5], 'two': [2, 3, 4]}, {'three': [3, 4, 5], 'one': [1, 2, 3]}, {'two': [2, 3, 4], 'one': [1, 2, 3]}] 

Creo que esto te conseguiría lo que necesitas.

 result list = [{combination_dict['one','two'],combination_dict['one','three']}] 

Encontré este tutorial muy útil:

http://bdhacker.wordpress.com/2010/02/27/python-tutorial-dictionaries-key-value-pair-maps-basics/