Frage

Weiß jemand, ob es eine eingebaute Funktion in Mathematica ist die linke Seite von downvalue Regeln für immer (ohne Beteiligung)? Ich weiß, wie man den Code zu schreiben, es zu tun, aber es scheint, grundlegendes genug für ein eingebaute in

Zum Beispiel:

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

BuiltInIDoNotKnowOf[a] kehrt {1,2}

War es hilfreich?

Lösung

Dies scheint zu funktionieren; wenn auch nicht sicher, wie nützlich es ist,:

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

Andere Tipps

Das ist wie keys() in Perl und Python und andere Sprachen, die für Hashes (aka Wörterbücher) zur Unterstützung aufgebaut haben. Als Ihr Beispiel zeigt, unterstützt Mathematica Hashes ohne spezielle Syntax. Sagen Sie einfach a[1] = 2 und Sie haben einen Hash. [1] Um die Schlüssel eines Hash zu bekommen, empfehle ich, diese zu Ihrem init.m oder Ihrer persönlichen Dienstprogramme Bibliothek:

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

(Oder die folgende reine Funktion Version ist angeblich etwas schneller:

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

)

So oder so, keys[a] jetzt wieder, was Sie wollen. (Sie können die Werte der Hash mit a /@ keys[a] erhalten.) Wenn Sie sich für höhere arity Hashes zulassen wollen, wie a[1,2]=5; a[3,4]=6 dann können Sie diese verwenden:

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

Welche {{1,2}, {3,4}} zurückgibt. (In diesem Fall können Sie die Hash-Werte mit a @@@ keys[a] erhalten.)

Beachten Sie, dass DownValues standardmäßig sortiert die Schlüssel, die wahrscheinlich am besten nicht eine gute Idee, da es zusätzliche Zeit in Anspruch nimmt. Wenn Sie die Schlüssel wollen sortiert Sie können einfach Sort@keys[f] tun. Deshalb würde ich eigentlich diese Version empfehlen:

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

Interessanterweise gibt es keine Erwähnung der Sort Option im DownValues Dokumention. Ich fand heraus, über es von einem alten Post von Daniel Lichtblau von Wolfram Research. (I bestätigt, dass es funktioniert immer noch in der aktuellen Version (7.0) von Mathematica.)


Fußnoten:

[1] Was ist wirklich praktisch ist, dass Sie, dass mit Funktionsdefinitionen mischen und zusammenbringen. Wie:

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

Sie können dann memoization hinzufügen, indem Sie die letzte Zeile

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

, die sagt, die Antwort für alle nachfolgenden Aufruf cachen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top