Question

Quelqu'un sait-il s'il existe une fonction intégrée dans Mathematica pour obtenir le nombre de règles de valeur inférieure (sans attente)? Je sais comment écrire le code pour le faire, mais cela semble assez basique pour une intégration

Par exemple:

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

BuiltInIDoNotKnowOf [a] renvoie {1,2}

Était-ce utile?

La solution

Cela semble fonctionner. je ne sais pas si c'est utile, cependant:

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

Autres conseils

Cela ressemble à keys () en Perl, en Python et dans d'autres langages prenant en charge les hachages (dictionnaires). Comme l'illustre votre exemple, Mathematica prend en charge les hachages sans syntaxe particulière. Dites simplement a [1] = 2 et vous avez un hachage. [1] Pour obtenir les clés d'un hachage, je vous recommande de l'ajouter à votre init.m ou à votre bibliothèque d'utilitaires personnels:

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

(Ou la version de fonction pure suivante est supposément légèrement plus rapide:

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

)

Dans les deux cas, les touches [a] renvoient maintenant ce que vous voulez. (Vous pouvez obtenir les valeurs du hachage avec les touches a / @ [a] .) Si vous souhaitez autoriser des hachages d'arité plus élevés, comme a [1,2] = 5; un [3,4] = 6 alors vous pouvez utiliser ceci:

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

Qui retourne {{1,2}, {3,4}} . (Dans ce cas, vous pouvez obtenir les valeurs de hachage avec a @@@ keys [a] .)

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 supplémentaire. Si vous voulez que les clés soient triées, vous pouvez simplement faire Trier @ clés [f] . Je recommanderais donc cette version:

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

Fait intéressant, l’option Sort n’est pas mentionnée dans la documentation DownValues ??. Je l'ai découvert dans un ancien billet de Daniel Lichtblau de Wolfram Research. (J'ai confirmé qu'il fonctionne toujours dans la version actuelle (7.0) de Mathematica.)

Notes de bas de page:

[1] Ce qui est vraiment pratique, c’est que vous pouvez combiner cela avec des définitions de fonctions. J'aime:

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

Vous pouvez ensuite ajouter un mémoization en modifiant la dernière ligne en

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top