我想知道是否可以使用变量字符串列表的内容来创建新变量。
举个例子:
str={"cow","monkey"}
从文件中提取这些字符串。现在我想将这些字符串称为变量。因此变量牛可以设置为{4,2,3}
或其他任何东西。任何引用str[[1]]
当然都会给出字符串“cow”。
任何线索还是这个坏主意?
当然,我可以在我已经拥有的列表中添加信息,例如:
str={{"cow",{4,2,3}},{"monkey",{}}
但是我仍然无法直接将牛作为变量来解决。
答案 0 :(得分:4)
最简单的方法是手动使用符号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
)。之后,您可以使用this问题的答案根据str1
中的位置分配变量。但是,这种方法的有用性也值得怀疑。
我认为最有意义的是创建所谓的indexed variables,例如
myIndexedVar["cow"] = 1;
myIndexedVar["monkey"] = 2;
其中myIndexedVar
本质上是键值对的哈希表,键是你的字符串,值是你想要分配给它们的值。如果需要,该过程可以自动化。
修改强>
为了说明对这些变量的赋值,这里有一个自动化的函数:
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很有用,因为它们为索引变量提供了机制。
答案 1 :(得分:3)
ToExpression
会将字符串转换为表达式。 Symbol["x"]
按名称建议创建符号x。
但是,我想知道你打算如何使用它们。如果您不知道先验文件中包含名称的内容,您将如何使用它们?如果str={"cow","monkey"}
并且我创建了带有strSym=ToExpression/@str
的符号列表,那么我在代码中继续的唯一方法就是索引第二个数组。我不能简单地在我的代码中说cow=5
因为我在编写代码时不知道会有一个名为cow的变量。
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作为Attribute。所以我不能通过索引来设置牛,除非我已经评估了索引,否则我会覆盖strSym [[1]]的定义。
答案 2 :(得分:3)
列昂尼德的最后一种方法可能是最好的,但我喜欢替换规则,因此我提供:
str={"cow","monkey"};
rules = {"cow" -> {4,2,3}, "monkey" -> {}};
str[[1]] /. rules
Out = {4, 2, 3}
有关详情,请参阅Rule
和ReplaceAll
。