Python快速将多个字符插入字符串的所有可能位置

Python快速将多个字符插入字符串的所有可能位置,python,numpy,Python,Numpy,我想在字符串的所有可能位置插入多个字符,我当前的实现是使用itertools.combinations_with_replacement()列出字符串的所有可能位置,然后将字符串转换为numpy数组,调用numpy.insert()将字符插入数组,最后使用join将插入的字符串数组转换回字符串。以插入2个字符为例: import numpy as np import itertools string = "stack" str_array = np.array(list(st

我想在字符串的所有可能位置插入多个字符,我当前的实现是使用
itertools.combinations_with_replacement
()列出字符串的所有可能位置,然后将字符串转换为
numpy
数组,调用
numpy.insert
()将字符插入数组,最后使用
join
将插入的字符串数组转换回字符串。以插入2个字符为例:

import numpy as np
import itertools
string = "stack"
str_array = np.array(list(string), dtype=str)
characters = np.array(["x", "y"], dtype=str)
new_strings = ["".join(np.insert(str_array, ix, characters)) for ix in itertools.combinations_with_replacement(range(len(string)+1), len(characters))]
产出:

这看起来很复杂,但如果我想在字符串中插入任意数量的字符(例如3个),我找不到更好的方法来实现这一点。我错过了更好更快的方法吗?

递归解决方案:

def mix(s, t, p=''):
  return s and t and mix(s[1:], t, p+s[0]) + mix(s, t[1:], p+t[0]) or [p + s + t]
My
p
是迄今为止构建的前缀。在每个递归步骤中,我使用
s
中的第一个字符或
t
中的第一个字符对其进行扩展。除非其中一个没有剩余字符,否则我只返回前缀加上剩余的字符

演示:


在您的示例案例中,它的速度大约是您的20倍。

您为什么要使用numpy而不是普通的python列表?通常,列表更适合随机访问/替换。阵列在数值、矢量化操作方面具有优越性。我不能用任何方式来检查性能,因为我在代码中运行了一个错误:<代码>索引错误:索引3对于Axess 0的大小为3 是不允许的。我确认与@ MistMistyIGIAGI相同的错误,如果您的代码如预期的那样工作,并且希望改进它,请考虑将其张贴到SO@JanStránský抱歉,我错误地输入了最后一行的代码。现在我已经改正了,应该可以了。谢谢。你说“所有可能的地方”,但你没有在“k”后面插入。太好了!使用
time
模块进行测试,比我的快50倍。您能详细解释一下
返回部分吗?谢谢。@Elkan补充了一些解释。
>>> mix('xy', 'stack')
['xystack', 'xsytack', 'xstyack', 'xstayck', 'xstacyk', 'xstacky', 'sxytack',
 'sxtyack', 'sxtayck', 'sxtacyk', 'sxtacky', 'stxyack', 'stxayck', 'stxacyk',
 'stxacky', 'staxyck', 'staxcyk', 'staxcky', 'stacxyk', 'stacxky', 'stackxy']