Создать переменную со списком строк - PullRequest
5 голосов
/ 31 мая 2011

Я хотел бы знать, возможно ли использовать содержимое списка переменных для создания новой переменной.

Например:

str={"cow","monkey"}

эти строки извлекаютсяиз файла.Теперь я хотел бы ссылаться на эти строки, как если бы это была переменная.Таким образом, переменная корова может быть установлена ​​на {4,2,3} или что-нибудь еще.Любая ссылка как str[[1]] дает строку "корова", конечно.

Любые подсказки или это плохая идея в любом случае?

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

str={{"cow",{4,2,3}},{"monkey",{}}

но тогда я все равно не смогу напрямую обращаться к корове как к переменной.

Ответы [ 3 ]

4 голосов
/ 31 мая 2011

Самое простое - просто использовать символы cow и monkey вручную, а не строки:

In[309]:= 
cow = 1;
monkey = 2;  
{cow, monkey}

Out[311]= {1, 2}

Но это, вероятно, не то, что вы спросили. Если вы хотите автоматически преобразовать строки в переменные, то то, что вам нужно сделать (если я правильно понял вопрос), это сначала преобразовать ваши строки в символы, поскольку символам можно присвоить значения и использовать в качестве переменных:

Remove[cow,monkey];
str = {"cow", "monkey"};
str1 = ToExpression /@ str

{cow, monkey}

(я предполагаю, что символы cow и monkey не были использованы / определены). После этого вы можете использовать ответ для этого вопроса, чтобы назначить переменные на основе их позиций в str1. Однако полезность этого подхода также сомнительна.

Что мне кажется наиболее целесообразным, так это создать так называемые индексированные переменные , такие как

myIndexedVar["cow"] = 1;
myIndexedVar["monkey"] = 2;

, где myIndexedVar - это, по сути, хэш-таблица пар ключ-значение, где ключи - это ваши строки, а значения - это то, что вы хотите им назначить. Процесс может быть автоматизирован при необходимости.

EDIT

Чтобы проиллюстрировать присвоения таким переменным, вот функция, которая автоматизирует это:

assignVariables[varNames_List, values_List, hashName_Symbol ] /; 
  Length[varNames] == Length[values] :=
    MapThread[(hashName[#1] = #2) &, {varNames, values}];

Вот как вы можете его использовать:

In[316]:= assignVariables[str,{{4,2,3},{}},myIndexedVar]

Out[316]= {{4,2,3},{}}

In[317]:= myIndexedVar["cow"]

Out[317]= {4,2,3}

In[318]:= myIndexedVar["monkey"]

Out[318]= {}

Но, опять же, это действительно хеш-таблица, поэтому ваш вопрос имеет для меня больше смысла, если переформулировать его следующим образом: «Я хочу создать хеш-таблицу со строковыми ключами. Какой самый простой способ сделать это в Mathematica, добавить пары ключ-значение и доступ к ним ". Ответ, кажется, - индексированные переменные, как показано выше. Вы также можете прочитать о DownValues ​​, поскольку они предоставляют механизм для индексированных переменных.

3 голосов
/ 31 мая 2011

Последний метод Леонида, вероятно, лучший, но мне нравятся правила замены, поэтому я предлагаю:

str={"cow","monkey"};

rules = {"cow" -> {4,2,3}, "monkey" -> {}};

str[[1]] /. rules
<b>  Out = {4, 2, 3}</b>

Подробнее см. Rule и ReplaceAll.

3 голосов
/ 31 мая 2011

ToExpression преобразует строку в выражение. Symbol["x"] создает символ x, как следует из названия.

Однако мне интересно, как вы планируете их использовать. Если вы не знаете a priori , что находится в файле с именами, как вы собираетесь их использовать? Если str={"cow","monkey"} и я создаю список символов с strSym=ToExpression/@str, то единственный способ продолжить работу в моем коде - это индексировать этот второй массив. Я не могу просто сказать cow=5 в своем коде, потому что на момент написания кода я не знал, что будет переменная с именем корова.

In[1]:= str = {"cow", "monkey"};
strSym = ToExpression /@ str

Out[2]= {cow, monkey}

In[3]:= strSym[[1]] // Evaluate = 5

Out[3]= 5

In[4]:= ?cow

Global`cow

cow=5

Как видите, для индексации также требуется дополнительная Evaluate, поскольку Set (=) имеет HoldFirst в качестве атрибута. Поэтому я не могу установить корову с помощью индексации, если у меня нет вычисленного индекса, иначе я перезаписываю определение strSym [[1]].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...