Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 使用字符串列表创建变量_List_Variables_String_Wolfram Mathematica - Fatal编程技术网

List 使用字符串列表创建变量

List 使用字符串列表创建变量,list,variables,string,wolfram-mathematica,List,Variables,String,Wolfram Mathematica,我想知道是否可以使用字符串变量列表的内容来创建新变量 例如: str={"cow","monkey"} 这些字符串是从文件中提取的。现在我想引用这些字符串,就像它是一个变量一样。因此,可以将变量cow设置为{4,2,3}或其他任何值。任何作为str[[1]]的引用都会给出字符串“cow” 有什么线索吗?或者这是个坏主意 当然,我可以在我已有的列表中添加以下信息: str={{"cow",{4,2,3}},{"monkey",{}} 但是,我仍然无法直接将cow作为变量来处理。最简单的方法是手

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

例如:

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

有什么线索吗?或者这是个坏主意

当然,我可以在我已有的列表中添加以下信息:

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

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

最简单的方法是手动使用符号
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
本质上是一个键值对的哈希表,键值是字符串,值是要分配给它们的任何值。如果需要,该过程可以自动化

编辑

为了说明这些变量的赋值,下面是一个函数,它自动执行以下操作:

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中,最简单的方法是什么,添加键值对并访问它们”。答案似乎是索引变量,如上所示。您可能会发现继续阅读也很有用,因为它们提供了索引变量的机制。

ToExpression
将字符串转换为表达式<代码>符号[“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

如您所见,索引还需要额外的求值,因为Set(=)具有HoldFirst As属性。因此,除非对索引进行评估,否则我无法通过索引设置cow,否则我将覆盖strSym[[1]]的定义。

Leonid的最后一种方法可能是最好的,但我喜欢替换规则,因此我提供:

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

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

str[[1]] /. rules
Out={4,2,3}
有关更多信息,请参见和。

您也可以使用
Symbol[]
中的
Symbol/@{“cow”,“monkey”}
。不过我也建议使用索引变量。或可能的替换列表或调度表:
values=dispatch[{“cow”->{4,2,3},“monkey”->{}]
“cow”/。值
。这可确保不会与现有符号发生任何意外冲突。@Szabolcs
Dispatch
的一个问题是,一旦形成了
Dispatch
-ed规则,您就无法轻松添加新的键值对,而无需创建新的
Dispatch
-ed规则并与该性能命中关联(别误会我的意思-我是<代码>快讯:)的忠实粉丝)。此外,我认为索引变量对于来自其他语言的用户来说必须更加直观,他们可能理解哈希表,但以前没有见过替换规则。这也是我的回答:使用
myIndexedVar[“cow”]
意味着知道“cow”在列表中。如果您知道这一点,为什么不使用cow符号呢?如果您不知道它在列表中,您也不能使用字符串“cow”作为参考。@Sjoerd我认为在此设置中使用符号是非常脆弱的,提到它们只是为了提供一个完整的图片(我实际上链接到了另一个SO问题,您的答案已被接受)-您仍然可以使用
str1
中符号的位置。至于如何使用字符串,请参见我的编辑,在那里我使用了
str
,不知道字符串“变量”的名称,只知道它们的编号。我并不是说这是非常明智的,但至少这可能是有意义的——如果你想以某种自动方式将键值对添加到散列中。另外,我在发布我的帖子时看不到你的答案:)@Sjoerd,不幸的是,这是真的,而且很烦人,但没有技术上的理由这样做。我希望有一个函数可以将新值插入分派表。您是否意识到分派和“函数定义”(即f[“a”]=2)的工作方式有任何差异,特别是在替换规则的排序方面?@All,Thx用于快速回复。它回答了我的问题并生成了一些新问题:)。我觉得索引变量将是最好的方法。我理解Sjoerd关于使用先验未知变量的问题。我在考虑使用这个模型来提高代码的可读性,它不应该是一个固定的独立程序,而应该是一个交互式的研究笔记本。欢迎来到stackoverflow Lou!别忘了为下面你喜欢的答案投票,如果其中一个答案让你满意,请用答案旁边的复选标记接受。你可以随时改变你的选择。这种方法的优点是它是最干净的一种——我不这么认为 Out = {4, 2, 3}