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.
您可以像这样设置一个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)
| 归档时间: |
|
| 查看次数: |
1194 次 |
| 最近记录: |