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”/。值
。这可确保不会与现有符号发生任何意外冲突。@SzabolcsDispatch
的一个问题是,一旦形成了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}