Вопрос

Кто-нибудь знает, есть ли в Mathematica встроенная функция для получения левых правил понижения стоимости (без какого-либо удержания)?Я знаю, как написать код для этого, но он кажется достаточно простым для встроенного

Например:

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

BuiltInIDoNotKnowOf[a] возвращает {1,2}

Это было полезно?

Решение

Кажется, это работает;хотя не уверен, насколько это полезно:

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

Другие советы

Это как keys() в Perl, Python и других языках со встроенной поддержкой хэшей (то есть словарей).Как показывает ваш пример, Mathematica поддерживает хэши без какого-либо специального синтаксиса.Просто скажи a[1] = 2 и у вас есть хеш.1] Чтобы получить ключи хэша, я рекомендую добавить это в свой init.m или библиотеку личных утилит:

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

(Или следующая версия чистой функции предположительно немного быстрее:

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

)

В любом случае, keys[a] теперь возвращает то, что вы хотите.(Вы можете получить значения хеша с помощью a /@ keys[a].) Если вы хотите разрешить хеши более высокой арности, например a[1,2]=5; a[3,4]=6 тогда вы можете использовать это:

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

Что возвращает {{1,2}, {3,4}}.(В этом случае вы можете получить хеш-значения с помощью a @@@ keys[a].)

Обратите внимание, что DownValues по умолчанию сортирует ключи, что, вероятно, не очень хорошая идея, поскольку в лучшем случае это занимает дополнительное время.Если вы хотите, чтобы ключи были отсортированы, вы можете просто сделать Sort@keys[f].Поэтому я бы порекомендовал эту версию:

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

Интересно, что нет никаких упоминаний о Sort вариант в DownValues документация.Я узнал об этом из старого поста Дэниела Лихтблау из Wolfram Research.(Я подтвердил, что это все еще работает в текущей версии Mathematica (7.0).)


Сноски:

[1] Что действительно удобно, так это то, что вы можете комбинировать это с определениями функций.Нравиться:

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

Затем вы можете добавить запоминание, изменив последнюю строку на

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

в котором говорится кэшировать ответ для всех последующих вызовов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top