使用字符串列表创建变量

时间:2011-05-31 12:11:55

标签: list variables string wolfram-mathematica

我想知道是否可以使用变量字符串列表的内容来创建新变量。

举个例子:

str={"cow","monkey"}

从文件中提取这些字符串。现在我想将这些字符串称为变量。因此变量牛可以设置为{4,2,3}或其他任何东西。任何引用str[[1]]当然都会给出字符串“cow”。

任何线索还是这个坏主意?

当然,我可以在我已经拥有的列表中添加信息,例如:

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

但是我仍然无法直接将牛作为变量来解决。

3 个答案:

答案 0 :(得分:4)

最简单的方法是手动使用符号cowmonkey而不是字符串:

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

Out[311]= {1, 2}

但这可能不是你问的。如果要自动将字符串转换为变量,那么 你要做的是(如果我理解正确的话)是先将你的字符串转换为符号,因为符号可以赋值并用作变量:

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

{cow, monkey}

(我假设未使用/定义符号cowmonkey)。之后,您可以使用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}

有关详情,请参阅RuleReplaceAll