首页 > 解决方案 > 在 Python 中将某个字符添加到字符串(对于每个可能的组合)

问题描述

例如,如果我有一个字符串helloWorld和一个字符,我想要那个#

该程序会吐出这些:

h#elloworld , he#lloworld , ...依此类推,但随后会跳转到两个#:

h#e#lloworld , h#el#loworld, ...然后它跳到三个#,依此类推..

但不允许有两个或多个连续的#,字符串前后不能有#。只在中间。

这些是不允许的:#he#llo#wor#ld因为它在实际字符串之前有一个 # 。 he##llowor#ld因为它有 2 个连续的 # 并且也是he#llo#wor#ld#不允许的,因为它在实际字符串后面有一个井号标签..

这让我想了很多,我不太明白如何想出一个程序,我尝试了这个:

def eachOptChar(str, c):
    from math import comb

    listOfOpts = []
    l = len(str)

    for i in range(1, l-1):
        for j in range(1, l - 1):
            combL = comb(i, j)
            for _ in range(combL):
                listOfOpts.append(str[:i] + c + str[i + 1:])
                j+=1
    return listOfOpts

我的想法:我尝试使用组合数学,首先我选择要放置多少个字符,然后将其添加到字符串并附加到列表中。但它只提出了一个#的解决方案(而且很多时候......)

有没有优雅的方法呢?谢谢!

我会很感激你的帮助,谢谢!

标签: pythonpython-3.xstring

解决方案


更新#2:这个简短的脚本生成满足所述约束的所有可能排列。

为了帮助理解脚本现在可以工作,打印“二进制”变量的值并查看它与“行”变量的关系。另请注意,“i”始终是偶数,以防止添加“。” 在行尾。(我几乎是盲人,所以我使用了一个点,我发现它更容易与磅符号区分开来。)

享受!

def foo(str, c):
    length = len(str)
    for n in range(0, 2**length, 2):
        binary = f'{n:{length}b}'
        line = ''
        for i in range(length):
            line += str[i]
            if binary[i] == '1':
                line += c
        print(line)

foo('Hello', '.')

输出

Hello
Hell.o
Hel.lo
Hel.l.o
He.llo
He.ll.o
He.l.lo
He.l.l.o
H.ello
H.ell.o
H.el.lo
H.el.l.o
H.e.llo
H.e.ll.o
H.e.l.lo
H.e.l.l.o

更新:copy.copy() 被删除,因为它不需要。

此代码将执行您似乎描述的操作,但它不会在给定字符串中生成“#”字符的所有可能组合!

脚本:

def insert_char(c, string, index):
    return string[:index] + c + string[index:]

def do(str, c, n):
    l = len(str)
    for i in range(n, l):
        new = insert_char(c, str, i)
        print(new)
        if i == n:
            first = new
    return first

str = 'Hello World'
l = len(str)
for i in range(1, 2*l-1, 2):
    str = do(str, '.', i)

输出:

H.ello World
He.llo World
Hel.lo World
Hell.o World
Hello. World
Hello .World
Hello W.orld
Hello Wo.rld
Hello Wor.ld
Hello Worl.d
H.e.llo World
H.el.lo World
H.ell.o World
H.ello. World
H.ello .World
H.ello W.orld
H.ello Wo.rld
H.ello Wor.ld
H.ello Worl.d
H.e.l.l.o. World
H.e.l.l.o .World
H.e.l.l.o W.orld

...

H.e.l.l.o. .W.o.rld
H.e.l.l.o. .W.or.ld
H.e.l.l.o. .W.orl.d
H.e.l.l.o. .W.o.r.ld
H.e.l.l.o. .W.o.rl.d
H.e.l.l.o. .W.o.r.l.d

推荐阅读