我正在使用Mathematica并且有一组变量(A,B,C,D,...),其属性A =(蓝色,大,圆形),B =(红色,小,尖尖),以及等等。这些属性在变量之间可能很常见。查找共享共同属性(例如,小)的所有变量的最佳通用方法是什么?感谢。
答案 0 :(得分:7)
以下是可能的属性列表:
In[1]:= properties={"red","green","blue","big","small","rounded","spiky"};
这是一个包含其中一些属性的对象列表
In[2]:= list={{"blue","big","rounded"},{"red","small","spiky"},
{"red","big","rounded"},{"blue","small","spiky"}};
您可以使用Select
找到具有“蓝色”属性的所有对象
In[3]:= Select[list, MemberQ[#,"blue"]&]
Out[3]= {{blue,big,rounded},{blue,small,spiky}}
这可以包含在一个函数中。虽然我将如何编写该函数将取决于您计划的数据结构和用法。
实际上,我只是重读了一个问题,你有一个带有一些属性的对象列表,你想要按名称引用这些对象。所以你可能想要更像
的东西In[1]:= listProperties["A"]:={"blue","big","rounded"}
listProperties["B"]:={"red","small","spiky"}
listProperties["C"]:={"red","big","rounded"}
listProperties["D"]:={"blue","small","spiky"}
上面我定义了一些与某些字符串相关的属性。您不必在上面或下面使用字符串,并且您可以创建比您想要的更好的结构。你也可以创建一个构造函数来创建上面的,这样的构造函数也可以检查提供的属性列表是否是正确的形式 - 即没有相互矛盾的属性,都在已知属性的列表等...
然后我们定义一个函数来测试对象/字符串是否具有与之关联的特定属性
In[2]:= hasProperty[obj_, property_]:=MemberQ[listProperties[obj],property]
如果listProperties[obj]
没有与之关联的定义/规则,您可能希望返回错误或警告消息。
使用Select
查找列表中具有相关属性“blue”的所有“对象”:
In[3]:= Select[{"A","B","C","D"}, hasProperty[#,"blue"]&]
Out[3]= {A,D}
还有其他方法(可能更好的方法)来设置这样的数据结构。但这是Mathematica中最简单的方法之一。