根据Mahtematica中内部列表元素的字母顺序对列表进行排序

Qia*_* Li 3 wolfram-mathematica

我有一个列表列表,内部列表可能有可变长度.我需要根据内部列表元素的字母顺序对外部列表进行排序.例如,给出一个列表

{{0, 0, 7}, {5, 0, 2, 3}, {0, 0, 10, 0}, {0, 6, 2}, {5, 1, 2}, {0, 3, 6, 1, 4}}

我想后的输出Sort

{{0, 0, 10, 0}, {0, 0, 7}, {0, 3, 6, 1, 4}, {0, 6, 2}, {5, 0, 2, 3}, {5, 1, 2}}

我只是不知道如何处理内部列表的可变长度以编写比较函数.请帮忙.

编辑

顺便说一下,原始列表是数字列表.

编辑2

例如,我有一个列表:

{{0,0,7},{5,0,2,3},{0,0,11,0},{0,0,1,12},{0,6,2},{5, 1,2},{0,3,6,1,4}}

输出应该是:

{{0,0,1,12},{0,0,11,0},{0,0,7},{0,3,6,1,4},{0,6,2},{ 5,0,2,3},{5,1,2}}

原因是1词汇量小于11,小于7.

Seb*_*olm 6

您可以像这样设置一个lexciographic比较器:

lexComp[_, {}] := False;
lexComp[{}, _] := True;
lexComp[{a_, as___}, {b_, bs___}] := a < b || a == b && lexComp[{as}, {bs}];
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用它进行排序以获得所需的效果:

Sort[{{0, 0, 7}, {5, 0, 2, 3}, {0, 0, 10, 0}, {0, 6, 2}, {5, 1, 2}, {0, 3, 6, 1, 4}}, lexComp]

{{0, 0, 7}, {0, 0, 10, 0}, {0, 3, 6, 1, 4}, {0, 6, 2}, {5, 0, 2, 3}, {5, 1, 2}}
Run Code Online (Sandbox Code Playgroud)

如果您希望将数字视为排序中的字符串,可以像下面这样修改它:

lessAsString[a_, b_] := Order @@ (ToString /@ {a, b}) === 1;

olexComp[_, {}] := False;
olexComp[{}, _] := True;
olexComp[{a_, as___}, {b_, bs___}] := lessAsString[a, b] || a === b && olexComp[{as}, {bs}];
Run Code Online (Sandbox Code Playgroud)

以下是这种类型的示例:

In[5]:= Sort[{{0, 0, 7}, {5, 0, 2, 3}, {0, 0, 11, 0}, {0, 0, 1, 12}, {0, 6, 2}, {5, 1, 2}, {0, 3, 6, 1, 4}}, olexComp]

Out[5]= {{0, 0, 1, 12}, {0, 0, 11, 0}, {0, 0, 7}, {0, 3, 6, 1, 4}, {0, 6, 2}, {5, 0, 2, 3}, {5, 1, 2}}
Run Code Online (Sandbox Code Playgroud)

  • 选择正确答案,因为它显示了如何自定义比较器,以便我可以在其他情况下使用它. (2认同)