【问题标题】:How to insert one or more character in the middle of a string using python?如何使用python在字符串中间插入一个或多个字符?
【发布时间】:2021-07-28 13:15:17
【问题描述】:

我想列出一个 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,基本上我需要在文本中多次插入* 符号和括号。

我试过谷歌搜索,我发现我需要正则表达式来做到这一点。但是,我从未使用过正则表达式。所以我正在寻找一种不使用正则表达式的替代方法。我什至不知道没有正则表达式是否可行。如果不是,请告诉我。

【问题讨论】:

  • 请为 n=4 或更多添加一些示例?我想这些情况下的括号可能是多个集合,例如(a * b * c) * d(a * b) * (c * d)a * (b * c) * da * (b * c * d),所有这些都是相等的。
  • 嗨@AKS,您的问题更像是代数问题。不管怎样,我怕你弄错了。对于 n=4,前 3 行将与 n=3 相同,但第四行将是 a* (a * d) =(a * a) * d。这里是二元运算,二元运算的结合性是这样定义的。例如,你的 (abc) 没有任何意义,除非它是一个三元运算符并且你的符号是这样表达的。否则,n=3 和 n=4 之间的区别在于 n=4 将有 64 行而不是 27 行。
  • 我明白了,所以可以肯定地说,不管字符串中有多少元素,比如 abcabcd,您总是生成 3 个字符的排列吗?
  • 是的。确切地。这就是关联性!

标签: python regex permutation


【解决方案1】:

不幸的是,Python 中的字符串不是可变对象,因此您只需在某个位置插入一个字符即可。 (而且正则表达式也无济于事——它们有一种奇特的机制来替换某些文本,虽然可以通过调用 re.sub 来执行您想要的插入,但要找出正确的正则表达式和回调函数来执行此操作不值得)

另一方面,Python 的lists 是可以任意更改的序列。幸运的是,有一种简单的机制可以将字符串转换为列表并返回。获得列表后,您可以使用 .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 和更多生成更通用的输出。谢谢。
  • my_list = permutation_func('abc', 3) for i in my_list: i1 = group_tokens(i,1,3) i2 = group_tokens(i,0,2) i2 = i2.replace("*)",")*") print(i1, " = ", i2) 这给出了确切的解决方案
【解决方案2】:

基于 cmets,以下应该可以工作

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个条目。

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2020-04-13
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 2012-09-25
    • 2011-03-16
    相关资源
    最近更新 更多