Calcular rango de una combinación?

Quiero calcular previamente algunos valores para cada combinación en un conjunto de combinaciones. Por ejemplo, al elegir 3 números del 0 al 12, calcularé algún valor para cada uno:

>>> for n in choose(range(13), 3):
    print n, foo(n)

(0, 1, 2) 78
(0, 1, 3) 4
(0, 1, 4) 64
(0, 1, 5) 33
(0, 1, 6) 20
(0, 1, 7) 64
(0, 1, 8) 13
(0, 1, 9) 24
(0, 1, 10) 85
(0, 1, 11) 13
etc...

Quiero almacenar estos valores en una matriz para que, dada la combinación, pueda calcularlos y obtener el valor. Por ejemplo:

>>> a = [78, 4, 64, 33]
>>> a[magic((0,1,2))]
78

Que seriamagic ¿ser?

Inicialmente pensé simplemente almacenarlo como una matriz tridimensional de tamaño 13 x 13 x 13, para poder indexarlo fácilmente de esa manera. Si bien esto está bien para 13 elegir 3, esto tendría demasiada sobrecarga para algo como 13 elegir 7.

No quiero usar un dict porque eventualmente este código estará en C, y una matriz sería mucho más eficiente de todos modos.

ACTUALIZACIÓN: También tengo un problema similar, pero usando combinaciones con repeticiones, por lo que cualquier respuesta sobre cómo obtener el rango de esas sería muy apreciada =).

ACTUALIZACIÓN: Para que quede claro, estoy tratando de ahorrar espacio. Cada una de estas combinaciones en realidad se indexa en algo que ocupa mucho espacio, digamos 2 kilobytes. Si tuviera que usar una matriz de 13x13x13, serían 4 megabytes, de los cuales solo necesito 572 kilobytes usando (13 elegir 3) puntos.

Respuestas a la pregunta(7)

Su respuesta a la pregunta