Pregunta

¿Alguien sabe si hay una función incorporada en Mathematica para obtener el lhs de las reglas de desvalorización (sin ninguna retención)? Sé cómo escribir el código para hacerlo, pero parece lo suficientemente básico como para que esté integrado

Por ejemplo:

a[1]=2;
a[2]=3;

BuiltInIDoNotKnowOf [a] devuelve {1,2}

¿Fue útil?

Solución

Esto parece funcionar; aunque no estoy seguro de lo útil que es:

a[1] = 2
a[2] = 3
a[3] = 5
a[6] = 8
Part[DownValues[a], All, 1, 1, 1]

Otros consejos

Esto es como keys () en Perl y Python y otros idiomas que tienen soporte incorporado para hashes (también conocidos como diccionarios). Como ilustra su ejemplo, Mathematica admite hashes sin ninguna sintaxis especial. Simplemente diga a [1] = 2 y tendrá un hash. [1] Para obtener las claves de un hash, recomiendo agregar esto a su init.m o a su biblioteca de utilidades personales:

keys[f_] := DownValues[f][[All,1,1,1]]  (* Keys of a hash/dictionary. *)

(O la siguiente versión de función pura es supuestamente un poco más rápida:

keys = DownValues[#][[All,1,1,1]]&;     (* Keys of a hash/dictionary. *)

)

De cualquier manera, keys [a] ahora devuelve lo que quieres. (Puede obtener los valores del hash con a / @ keys [a] .) Si desea permitir hashes de mayor aridad, como a [1,2] = 5; a [3,4] = 6 entonces puedes usar esto:

SetAttributes[removeHead, {HoldAll}];
removeHead[h_[args___]] := {args}
keys[f_] := removeHead @@@ DownValues[f][[All,1]]

Lo que devuelve {{1,2}, {3,4}} . (En ese caso, puede obtener los valores de hash con a @@@ keys [a] .)

Tenga en cuenta que, por defecto, DownValues ?? ordena las claves, lo que probablemente no sea una buena idea, ya que, en el mejor de los casos, requiere más tiempo. Si desea ordenar las claves, simplemente puede hacer Sort @ keys [f] . Así que realmente recomendaría esta versión:

keys = DownValues[#,Sort->False][[All,1,1,1]]&;

Curiosamente, no se menciona la opción Sort en la documentación DownValues ??. Me enteré de ello en un antiguo post de Daniel Lichtblau de Wolfram Research. (Confirmé que aún funciona en la versión actual (7.0) de Mathematica).


Notas al pie:

[1] Lo que es realmente útil es que puede mezclar y combinar eso con las definiciones de funciones. Me gusta:

fib[0] = 1;
fib[1] = 1;
fib[n_] := fib[n-1] + fib[n-2]

Luego puedes agregar la memoria cambiando la última línea a

fib[n_] := fib[n] = fib[n-1] + fib[n-2]

que dice que se almacene en caché la respuesta para todas las llamadas posteriores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top