用字符串列表创建变量

Lou*_*Lou 5 string variables wolfram-mathematica list

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

举个例子:

str={"cow","monkey"}
Run Code Online (Sandbox Code Playgroud)

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

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

当然,我可以在列表中添加信息,例如:

str={{"cow",{4,2,3}},{"monkey",{}}
Run Code Online (Sandbox Code Playgroud)

但是我仍然无法直接将Cow作为变量来处理。

Leo*_*rin 4

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

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

Out[311]= {1, 2}
Run Code Online (Sandbox Code Playgroud)

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

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

{cow, monkey}
Run Code Online (Sandbox Code Playgroud)

(我假设符号cowmonkey尚未使用/定义)。之后,您可以使用问题的答案根据变量在 中的位置分配给变量str1。然而,这种方法的实用性也值得怀疑。

我认为最有意义的是创建所谓的索引变量,例如

myIndexedVar["cow"] = 1;
myIndexedVar["monkey"] = 2;
Run Code Online (Sandbox Code Playgroud)

其中myIndexedVar本质上是一个键值对的哈希表,键是您的字符串,值是您想要分配给它们的任何内容。如果需要,该过程可以自动化。

编辑

为了说明对此类变量的分配,这里有一个自动执行此操作的函数:

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

以下是如何使用它:

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]= {}
Run Code Online (Sandbox Code Playgroud)

但同样,这确实是一个哈希表,所以当你的问题重新表述为:“我想用字符串键创建一个哈希表。在 Mathematica 中最简单的方法是什么,添加键值配对并访问它们”。答案似乎是 - 索引变量,如上所示。您可能还会发现阅读DownValues很有用,因为它们提供了索引变量的机制。

  • 您还可以使用 `Symbol[]`,如 `Symbol /@ {"cow", "monkey"}`。我还建议使用索引变量。或者可能是替换列表或调度表: `values = Dispatch[{"cow" -> {4,2,3},"monkey" -> {}}]` 和 `"cow" /。价值观`。这确保了不会与已有的符号发生任何意外冲突。 (3认同)