查找共享公共属性的变量

时间:2011-07-20 04:45:11

标签: variables properties wolfram-mathematica

我正在使用Mathematica并且有一组变量(A,B,C,D,...),其属性A =(蓝色,大,圆形),B =(红色,小,尖尖),以及等等。这些属性在变量之间可能很常见。查找共享共同属性(例如,小)的所有变量的最佳通用方法是什么?感谢。

1 个答案:

答案 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中最简单的方法之一。