【问题标题】:two questions on string manipulation in MathematicaMathematica 中关于字符串操作的两个问题
【发布时间】:2011-11-17 20:33:06
【问题描述】:
  1. 给定一个字符或字符串s,生成一个带有n(整数)重复s的结果字符串
  2. 给定一个字符或字符串列表,以及它们出现频率的列表(对应),生成一个结果字符串,列表中的每个字符串按照第二个列表中指定的所需次数重复,然后将它们连接在一起.例如,给定{"a", "b", "c"}{1,0,3},我想要"accc"

我当然希望有最有效的方法来做这些。不然我自己的方式太丑太慢了。

感谢您的帮助!

【问题讨论】:

  • 第二个问题是因为我对组合问题的回答吗?我几乎在那篇文章中包含了MapThread 代码,但我决定不这样做。我应该有吗?
  • 先生。法师,和你猜的一样。 :)

标签: wolfram-mathematica


【解决方案1】:
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”

【讨论】:

  • 我在做Nest[StringJoin[s,#]&,"",n],当然比内置慢!
  • @Qiang Li 在这种情况下使用Nest 类似于使用AppendTo 进行列表构建,并导致解决方案的类似二次复杂度。这是缓慢的主要原因,而不是与内置插件本身的背离。
  • 有一个漏洞,应该是s_String而不是s__StringConstantArray 一次传递不止一个字符串会生气。
  • @rcollyer 谢谢,我很幸运能先得到答案! (__确实是一个错字,已修复,谢谢)
  • 是的,我花时间链接到相关文档,如果我没有,答案就是我的! :P 而且,我仍然认为我有超过 5k 的代表...... :(
【解决方案2】:

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

s = "samplestring";

  StringJoin[Table[s, {3}]]

  "samplestringsamplestringsamplestring"

但如果您关心最后 1/100 秒,acl 使用 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"

【讨论】:

    【解决方案3】:

    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”}

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 2011-07-11
      • 2020-08-31
      • 1970-01-01
      相关资源
      最近更新 更多