два вопроса о работе со строками в Mathematica - PullRequest
2 голосов
/ 18 ноября 2011
  1. С учетом символа или строки s, сгенерировать результирующую строку с n (целым числом) повторов s
  2. С учетом списка символов или строк и спискаиз частот их появления (в соответствии), сгенерируйте результирующую строку с каждой строкой в ​​списке, повторенной с желаемым временем, указанным во втором списке, и StringJoin их вместе.Например, учитывая {"a", "b", "c"} и {1,0,3}, я хочу иметь "accc".

Я, конечно, хочу иметь самый эффективный способ сделать это.В противном случае мой собственный путь будет слишком уродливым и медленным.

Спасибо за вашу помощь!

Ответы [ 3 ]

12 голосов
/ 18 ноября 2011
rep[s_String, n_] := StringJoin[ConstantArray[s, n]]

затем

rep["f", 3]
(*fff*)

далее

chars = {"a", "b", "c"};
freqs = {1, 0, 3};

StringJoin[MapThread[rep, {chars, freqs}]]

дает "accc"

5 голосов
/ 18 ноября 2011

Для 1 Table будет делать то, что вам нужно.

s = "samplestring";

  StringJoin[Table[s, {3}]]

  "samplestringsamplestringsamplestring"

Но ответ acl с использованием ContantArray быстрее, если вы заботитесь о последней 1/100 секунде.

Do[StringJoin[Table[s, {30}]];, {10000}] // Timing

{0.05805, Null}

Do[StringJoin[ConstantArray[s, 30]];, {10000}] // Timing

{0.033306, Null}

Do[StringJoin[Table[s, {300}]];, {10000}] // Timing

{0.39411, Null}

Do[StringJoin[ConstantArray[s, 300]];, {10000}] // Timing

{0.163103, Null}

Для 2 MapThread будет обрабатывать случаи, когда известно, что второй список является неотрицательными целыми числами.

StringJoin @ 
 MapThread[Table[#1, {#2}] &, {{"a", "b", "c"} , {1, 0, 3}}]

"accc"

Если второй список содержит отрицательные целые числа, они рассматриваются как нули.

Нецелые элементы во втором списке обрабатываются так, как будто они являются целочисленной частью. Я не уверен, что вы этого хотите.

StringJoin @ 
 MapThread[Table[#1, {#2}] &, {{"a", "b", "c"} , {1, 0, 3.7}}]

"accc"
2 голосов
/ 18 ноября 2011

Зная вашу заявку Я предлагаю использовать Inner:

sets = {{0, 0, 0, 4}, {0, 0, 1, 3}, {0, 1, 0, 3}, {0, 1, 1, 2}, {0, 2, 0, 2},
        {0, 2, 1, 1}, {1, 0, 0, 3}, {1, 0, 1, 2}, {1, 1, 0, 2}, {1, 1, 1, 1},
        {1, 2, 0, 1}, {1, 2, 1, 0}, {2, 0, 0, 2}, {2, 0, 1, 1}, {2, 1, 0, 1},
        {2, 1, 1, 0}, {2, 2, 0, 0}};

chars = {"a", "b", "c", "d"};

Inner[ConstantArray[#2, #] &, sets, chars, StringJoin]
{"dddd", "cddd", "bddd", "bcdd", "bbdd", "bbcd", "addd", "acdd",
"abdd", "abcd", "abbd", "abbc", "aadd", "aacd", "aabd", "aabc", "aabb"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...