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}}} *)