Лучший способ изменить порядок элементов списка в Mathematica - PullRequest
3 голосов
/ 26 декабря 2011

Я хочу изменить порядок результата Tally[Characters["2723198931"]] в соответствии с первым компонентом каждого элемента в порядке lst = {"3", "1", "2", "9"}.То есть, я хочу, чтобы результат был {{{"3", 2}}, {{"1", 2}}, {{"2", 2}}, {{"9", 2}}}.

. В настоящее время у меня есть какое-то уродливое решение, но мне интересно, может ли кто-нибудь помочь дать краткое решение.Большое спасибо.

Ответы [ 3 ]

5 голосов
/ 26 декабря 2011

в одну сторону может быть

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 утра

снимок экрана выше, яЯ использую v 8.04 на Windows 7

enter image description here

4 голосов
/ 26 декабря 2011

Это должно быть довольно быстро, но я не проверял это.В длинных списках вы можете получить лучшую производительность, используя Dispatch[rls].

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

rls = #[[1]] -> # & /@ tal;
key /. rls
{{"3", 2}, {"1", 2}, {"2", 2}, {"9", 2}}

В качестве альтернативы вы можете использовать это, что немного быстрее для длинных списков Tally:

rls = Thread[tal[[All, 1]] -> tal];
2 голосов
/ 26 декабря 2011

В качестве альтернативы, вы можете сделать что-то вроде

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}}} *)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...