s
,生成n
重复s
{"a", "b", "c"}
(整数)结果字符串
{1,0,3}
和"accc"
,我希望{{1}}。我当然希望有最有效的方法来做这些。否则,我自己的方式太丑陋而且很慢。
感谢您的帮助!
答案 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"}