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.
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! –
On dirait que DownValues [a] [[All, 1, 1, 1]] fonctionne aussi, au moins dans cet exemple simple. –