如何使用Python在字符串中间插入一个或多个字符?

3

我想列出n个元素的群组中所有可能的关联操作。例如,当n=3时,我希望它打印:

a*(a*a)  =  (a*a)*a
a*(a*b)  =  (a*a)*b
a*(a*c)  =  (a*a)*c
... 24 more lines

现在,我尝试编写以下Python3代码来实现这个功能。
import itertools as it

def permutation_func(str_, rep):
  chars = list(str_)
  results = []
  for tuple_ in it.product(chars, repeat = rep):
    i = ''.join(tuple_)
    results.append(i)
  return results
 
my_list = permutation_func('abc', 3)

for i in my_list:
    print(i, " = ", i)

然而,我得到的输出是:
aaa  =  aaa
aab  =  aab
aac  =  aac
... and 24 more lines

我认为我正在正确的轨道上。但我无法弄清楚如何将 aaa = aaa 转换成 a*(a*a) = (a*a)*a,基本上我需要在文本中多次插入 * 符号和括号。
我尝试搜索并发现需要使用正则表达式来完成这个操作。然而,我从未使用过正则表达式。因此,我正在寻找一种不使用正则表达式的替代方法。我甚至不知道是否可以在没有正则表达式的情况下实现,如果不行,请告诉我。

3
请为 n=4 或更多的情况添加一些示例?我想在这些情况下括号可以存在于多个集合中,例如 (a * b * c) * d(a * b) * (c * d)a * (b * c) * d 或者 a * (b * c * d),而所有这些都相等。 - AKS
嗨@AKS,你的问题更像是一个代数问题。无论如何,我很抱歉你搞错了。当n=4时,前三行与n=3相同,但第四行将是a(ad)=(aa)d。这里是二元运算,二元运算的结合性定义如下。例如,你的(abc)没有任何意义,除非它是一个三元运算符,并且这是你的表示法。否则,n=3和n=4之间的区别在于n=4将有64行而不是27行。 - Abdul Muhaymin
1
我明白了,那么可以这样说,无论字符串中有多少个元素,比如 abc 或者 abcd,你总是在生成一个由三个字符组成的排列吗? - AKS
是的,没错。这就是结合性! - Abdul Muhaymin
2个回答

2

很遗憾,Python中的字符串不是可变对象 - 因此你只能在某个位置插入字符。(正则表达式也无法帮助 - 它们有一种复杂的机制来替换一些文本,虽然可以通过调用re.sub实现所需的插入,但是找出正确的正则表达式和回调函数来执行这个操作是不值得的)

另一方面,Python的list是可以任意更改的序列。幸运的是,有一个简单的机制将字符串转换为列表并进行转换。一旦你有了一个列表,你可以使用.insert方法或切片分配来插入你的值:

a = "aaa"
b = list(a)
b.insert(1, "*")
b.insert(2, "(")
b.insert(4, "*")
b.insert(6,")")
c = "".join(b)

根据您的意图,也许这不是实现它的最实用方式 - 您可能需要编写一个函数,该函数将接收一系列标记作为输入(可以是列表,或者仅由单字符标记组成的字符串),以及分组和插值字符的说明,然后将其作为字符串返回:

def group_tokens(tokens, start, end, join="*"):
    output = ""
    for index, token in enumerate(tokens):
        if index != 0:
            output += join
        if index == start:
            output += "("
        elif index == end:
            output += ")"
        output += token
    if end >= len(tokens):
        output += ")"
    return output

函数group_tokens()正是我想要的。我在代码末尾使用它,解决了我的问题。这段代码甚至帮助我为n=4及以上生成更通用的输出。谢谢。 - Abdul Muhaymin
my_list = permutation_func('abc', 3)对于我的列表: 对于i in my_list: i1 = group_tokens(i,1,3) i2 = group_tokens(i,0,2) i2 = i2.replace(")",")") print(i1, " = ", i2)这就是给出精确解决方案的方法。 - Abdul Muhaymin

1
根据评论,以下内容应该可以工作。
for c1, c2, c3 in itertools.product('abc', repeat=3):
    print(f'({c1}*{c2})*{c3} = {c1}*({c2}*{c3})')

它打印出以下内容:
(a*a)*a = a*(a*a)
(a*a)*b = a*(a*b)
(a*a)*c = a*(a*c)
... 24 more

如果您用字符串abcd替换它,它将生成64个条目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接