关于Mathematica中字符串操作的两个问题

时间:2011-11-17 20:33:06

标签: wolfram-mathematica

  1. 给定字符或字符串s,生成n重复s
  2. {"a", "b", "c"}(整数)结果字符串
  3. 给定一个字符或字符串列表,以及它们出现的频率列表(对应),生成一个结果字符串,列表中的每个字符串都按照第二个列表中指定的所需时间重复并且StringJoin它们在一起。例如,给定{1,0,3}"accc",我希望{{1}}。
  4. 我当然希望有最有效的方法来做这些。否则,我自己的方式太丑陋而且很慢。

    感谢您的帮助!

3 个答案:

答案 0 :(得分:12)

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”

答案 1 :(得分:5)

对于1,Table将满足您的需求。

s = "samplestring";

  StringJoin[Table[s, {3}]]

  "samplestringsamplestringsamplestring"

但如果您关心最后1/100秒,使用ContantArray的答案会更快。

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 :(得分:2)

Knowing your application我建议使用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"}