Wolfram mathematica 在Mathematica中对列表元素重新排序的更好方法

Wolfram mathematica 在Mathematica中对列表元素重新排序的更好方法,wolfram-mathematica,Wolfram Mathematica,我想按照lst={“3”、“1”、“2”、“9”}的顺序,根据每个元素的第一个分量对Tally[Characters[“2723198931”]的结果重新排序。也就是说,我希望输出是{{{“3”,2},{{{“1”,2},{{“2”,2},{{“9”,2}}} 目前,我有一个丑陋的解决方案,但不知道是否有人可以帮助给出一个简洁的解决方案。非常感谢。一种方法可能是 data = Tally[Characters["2723198931"]]; lst = {"3", "1", "2", "9"};

我想按照
lst={“3”、“1”、“2”、“9”}
的顺序,根据每个元素的第一个分量对
Tally[Characters[“2723198931”]
的结果重新排序。也就是说,我希望输出是
{{{“3”,2},{{{“1”,2},{{“2”,2},{{“9”,2}}}

目前,我有一个丑陋的解决方案,但不知道是否有人可以帮助给出一个简洁的解决方案。非常感谢。

一种方法可能是

data = Tally[Characters["2723198931"]];
lst = {"3", "1", "2", "9"};

(*algorithm*)

pos =  Position[data[[All, 1]], #] & /@ lst;
Extract[data, pos]
输出

{{{"3", 2}}, {{"1", 2}}, {{"2", 2}}, {{"9", 2}}}
凌晨2:37更新

上面的屏幕截图,我正在Windows7上使用V8.04


这应该很快,但我没有测试。在长列表中,使用
Dispatch[rls]
可以获得更好的性能

key = {"3", "1", "2", "9"};
tal = Tally[Characters["2723198931"]];

rls = #[[1]] -> # & /@ tal;
key /. rls

或者,你可以做一些类似的事情

With[{tal = Tally[Characters["2723198931"]]},
  Flatten@Pick[tal, tal[[All, 1]], #] & /@ key] 
你总是在计算字符串中的字符吗?如果是这样的话,直接计数字符可能比首先将其转换为字符列表更有效。例如考虑

str = StringJoin[RandomChoice[CharacterRange["0", "9"], 1000]];
key = {"3", "1", "2", "9"};

({#, StringCount[str, #]} & /@ key) // Timing

(* output: {0.000121, {{"3", 98}, {"1", 112}, {"2", 99}, {"9", 107}}} *)

With[{tal = Tally[Characters[str]]},
  Flatten@Pick[tal, tal[[All, 1]], #] & /@ key] // Timing 

(* output: {0.000567, {{"3", 98}, {"1", 112}, {"2", 99}, {"9", 107}}} *)

这就像我做的一样,尽管我使用了
Select
。是否有任何内置函数或更简单的方法?谢谢这对我来说不起作用。我需要
位置[data[[All,1]],#][[1]]
。它是否与版本8中所写的一样工作?@Mr.Wizard,它与我在版本8.04中所写的一样工作,请参见屏幕截图!这些方法的一个问题是扫描列表中
中的每个值。如果该示例在实际使用中具有代表性,那么这并不重要,但是在较长的
tall
上,它的效率非常低。在键/计数长度为5000时,
key/。Dispatch@Thread[tal[[All,1]]->tal]
的速度快了330倍以上。因为这不比
Pick
长,而且简单的版本短得多,速度更快,所以我更愿意公布这个方法。如果只介绍了
StringCount
方法,我会投赞成票,因为它适用于域。@Mr.Wizard:谢谢你的回答!
With[{tal = Tally[Characters["2723198931"]]},
  Flatten@Pick[tal, tal[[All, 1]], #] & /@ key] 
str = StringJoin[RandomChoice[CharacterRange["0", "9"], 1000]];
key = {"3", "1", "2", "9"};

({#, StringCount[str, #]} & /@ key) // Timing

(* output: {0.000121, {{"3", 98}, {"1", 112}, {"2", 99}, {"9", 107}}} *)

With[{tal = Tally[Characters[str]]},
  Flatten@Pick[tal, tal[[All, 1]], #] & /@ key] // Timing 

(* output: {0.000567, {{"3", 98}, {"1", 112}, {"2", 99}, {"9", 107}}} *)