Bu Perl ve Python ve sağlamalarının (aka sözlükler) desteği yerleşik diğer dillerde keys()
gibidir. Örneğinizin de gösterdiği gibi, Mathematica herhangi bir özel sözdizimi olmayan karmaları desteklemektedir. Sadece a[1] = 2
deyin ve bir hashınız var. [1] karmasının bir anahtarlarını almak için, ben senin init.m veya kişisel yardımcı programları kütüphanesine bu eklemenizi öneririz:
keys[f_] := DownValues[f][[All,1,1,1]] (* Keys of a hash/dictionary. *)
(Ya aşağıdaki saf fonksiyon versiyonu biraz daha hızlı olduğu iddia ediliyor:
keys = DownValues[#][[All,1,1,1]]&; (* Keys of a hash/dictionary. *)
)
iki şekilde de, keys[a]
şimdi istediğini döndürür. (Sen a /@ keys[a]
ile karma değerlerini elde edebilirsiniz.) Daha yüksek Arity karmaları için izin vermek istiyorsanız, a[1,2]=5; a[3,4]=6
o zaman bunu kullanabilirsiniz gibi:
SetAttributes[removeHead, {HoldAll}];
removeHead[h_[args___]] := {args}
keys[f_] := removeHead @@@ DownValues[f][[All,1]]
{{1,2}, {3,4}}
döndürür hangisi. (Bu durumda, a @@@ keys[a]
ile karma değerler alabilirsiniz.)
Varsayılan olarak, DownValues
anahtarının anahtarları sıraladığını unutmayın; bu, muhtemelen en iyi zamanın geçmesi nedeniyle iyi bir fikir değildir. Anahtarların sıralanmasını istiyorsanız sadece [email protected][f]
yapabilirsiniz. Bu yüzden bu sürümü öneriyoruz:
keys = DownValues[#,Sort->False][[All,1,1,1]]&;
İlginç DownValues
documention içinde Sort
seçeneği söz edilmemektedir. Wolfram Research'ten Daniel Lichtblau'nun eski bir yazısından öğrendim. (Ben hala Mathematica'nın güncel sürümü (7.0) 'de çalıştığını doğruladı.)
Dipnotlar:
[1] Gerçekten kullanışlı karıştırıp işlev tanımlarıyla birlikte eşleşmesi olabilir. Gibi:
fib[0] = 1;
fib[1] = 1;
fib[n_] := fib[n-1] + fib[n-2]
Ardından sonraki tüm aramalar için cevap önbelleğe diyor
fib[n_] := fib[n] = fib[n-1] + fib[n-2]
bu son satırı değiştirerek Memoization ekleyebilir.
Evet, [[]] notasyonuna benzer bir şey yapmayı denedim, ancak tutmayı kapattı ve rhs'yi alırdım. Ama bu harika çalışıyor! –
DownValues [a] [[All, 1, 1, 1]] gibi görünüyor, en azından bu basit örnekte çalışıyor. –