2008-09-25 6 views
10

Est-ce que quelqu'un sait s'il existe une fonction intégrée dans Mathematica pour obtenir les lhs de règles downvalue (sans aucune attente)? Je sais comment écrire le code pour le faire, mais il semble assez basique pour un haut-Mathematica Downvalue Lhs

Par exemple:

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

BuiltInIDoNotKnowOf[a] retours {1,2}

Répondre

9

Cela semble fonctionner; ne sais pas combien il est utile, si:

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

Oui, j'ai essayé de faire quelque chose de similaire avec la notation [[]], mais cela a désactivé la prise et j'ai eu le rhs. Mais, cela fonctionne très bien! –

+0

On dirait que DownValues ​​[a] [[All, 1, 1, 1]] fonctionne aussi, au moins dans cet exemple simple. –

22

C'est comme keys() en Perl et Python et d'autres langues qui ont un support intégré pour hash (aka dictionnaires). Comme votre exemple l'illustre, Mathematica prend en charge les hachages sans syntaxe particulière. Il suffit de dire a[1] = 2 et vous avez un hachage. [1] Pour obtenir les clés d'un hachage, je vous recommande d'ajouter ceci à votre init.m ou votre bibliothèque d'utilitaires personnelle:

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

(Ou pur version fonction suivante est censé être un peu plus rapide:

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

)

De toute façon, keys[a] retourne maintenant ce que vous voulez. (Vous pouvez obtenir les valeurs de hachage avec a /@ keys[a].) Si vous voulez permettre plus hash arity, comme a[1,2]=5; a[3,4]=6 vous pouvez utiliser ceci:

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

qui retourne {{1,2}, {3,4}}. Notez que DownValues trie les clés par défaut, ce qui n'est probablement pas une bonne idée car au mieux cela prend du temps. Si vous voulez trier les clés, vous pouvez simplement faire [email protected][f]. Donc, je recommande vraiment cette version:

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

Fait intéressant, il n'y a aucune mention de l'option Sort dans le DownValues documention. Je l'ai découvert à partir d'un ancien article de Daniel Lichtblau de Wolfram Research. (Je confirme que cela fonctionne encore dans la version actuelle (7.0) de Mathematica.)


Notes:

[1] Ce qui est vraiment à portée de main que vous pouvez mélanger et assortir que les définitions de fonction. Comme:

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

Vous pouvez ensuite ajouter memoization en changeant cette dernière ligne

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

qui dit en cache la réponse pour tous les appels.

Questions connexes