在Mathematica中保留变量名



在Mathematica中,我试图操作一个列表,这样我就可以从以下内容开始:

myList = List[{a,b,c,d}];
a=12;
b=15;
c=7;
d=9;

然后,我希望能够重新排序列表,输出的是变量名而不是数字。

正如@george在评论中所说,做你想做的事情的最简单方法之一就是使用转换规则。它们允许用一个值来代替符号,而不为该符号赋值。例如,在您的案例中(我把订单弄乱了,因为它与这里无关):

myValues = {d->9, a->12, b->15, c->7}

转换规则有两个参数,您可以提取它们。因此,这里有一种从转换规则列表中获取符号列表的方法。这里的Sort具有按字母顺序排列的符号。

myList = Sort[Map[First, myValues]]
{a, b, c, d}

要获得值列表,只需将转换规则应用于符号列表使用/.操作员

myList /. myValues 
{12, 15, 7, 9}

现在我们知道了如何做到这一点,我们可以根据符号的数值对其进行排序

mySortedList = myList[[Ordering[ myList /. myValues]]]
{c, d, a, b}

排序给出了元素在列表中的位置(如果对它们进行了排序)。在这里,我们使用数值列表,并将其顺序应用于符号列表。

据我所知,Mathematica中没有OrderingBy命令,您可以也可以通过在内部应用给定函数来对符号进行排序。按以下方式排序:

myList[[Ordering[Map[EulerPhi, myList /. myValues]]]]
{a, c, d, b}

我希望它适合你的申请。

在Mathematica中经常做的一件事是以转换规则的形式保持符号和值之间的关联,并对其进行操作

在你的情况下,它可以采取这种形式:

SortBy[ myValues, Last]
{c -> 7, d -> 9, a -> 12, b -> 15}

SortBy[myValues, EulerPhi[Last[#]] &]
{a -> 12, c -> 7, d -> 9, b -> 15}

然后您可以选择提取您想要的内容。这就是图形信息的操作方式。

myList = HoldForm[{a, b, c, d}];
a = 12;
b = 15;
c = 7;
d = 9;
Last /@ Sort[{ReleaseHold[#], #} & /@ Thread[myList]]

{c,d,a,b}

最新更新