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

Qia*_* Li 2 wolfram-mathematica

  1. 给定一个字符或字符串s,生成一个带有n(整数)重复的结果字符串s
  2. 给定一个字符或字符串列表,以及它们出现的频率列表(对应),生成一个结果字符串,列表中的每个字符串都按照第二个列表中指定的所需时间重复,并将它们连接在一起.例如,给定{"a", "b", "c"}{1,0,3},我想拥有"accc".

我当然希望有最有效的方法来做这些.否则,我自己的方式太丑陋和缓慢.

谢谢您的帮助!

acl*_*acl 12

rep[s_String, n_] := StringJoin[ConstantArray[s, n]]
Run Code Online (Sandbox Code Playgroud)

然后

rep["f", 3]
(*fff*)
Run Code Online (Sandbox Code Playgroud)

下一个

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

StringJoin[MapThread[rep, {chars, freqs}]]
Run Code Online (Sandbox Code Playgroud)

给出"accc"

  • @Qiang Li在这种情况下使用`Nest`类似于使用'AppendTo`进行列表构建,并导致解决方案的类似二次复杂性.这是缓慢的主要原因,而不是内置本身的偏离. (2认同)

Ver*_*eia 5

1,Table将做你需要的.

s = "samplestring";

  StringJoin[Table[s, {3}]]

  "samplestringsamplestringsamplestring"
Run Code Online (Sandbox Code Playgroud)

但是ContantArray如果你关心最后1/100秒,acl的回答使用速度会更快.

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}
Run Code Online (Sandbox Code Playgroud)

对于2,MapThread将处理第二个列表已知为非负整数的情况.

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

"accc"
Run Code Online (Sandbox Code Playgroud)

如果第二个列表包含负整数,则将它们视为零.

第二个列表中的非整数元素被视为它们是整数部分.我不确定这是不是你想要的.

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

"accc"
Run Code Online (Sandbox Code Playgroud)