找到一个单词中字符替换的每个排列

时间:2015-03-21 11:07:00

标签: python string python-2.7 permutation

虽然这似乎是一个已经回答的问题,但事实并非如此。

我正在尝试找到一种方法来执行以下操作:

  • 我有一个已知的字符串,例如"我爱狗"
  • 我有很多可能的角色,例如" @!470"
  • 我有一堆字符应该替换为"已知的字符串",例如s,e
  • 我希望用一种方法来代替每一次互动,在已知的字符串中#34;我喜欢狗&#34;,在#34;可能的角色&#34;中已知的1个单一角色,并让其他一切保持不变。< / LI>
  • 完成后,一次开始替换2个字符
  • 完成后,一次开始替换3个字符
  • 依此类推,直到我没有更多&#34;可能的角色&#34;

预期输出的一个例子如下所述:

  • 我知道字符串&#34;这是我的字符串&#34;
  • 我有一个可能的字符列表&#34;!$&#34;
  • 我有要替换的字符&#34;是&#34;

首先,程序将通过改变每个i来进行,具有:

"Th!s !s my str!ng"

接下来,它将改变$:

中的s
"Thi$ i$ my $tring"

现在我完成了1个字符的排列,我需要开始2个字符的排列:

"Th!$ !s my $tr!ng"

由于我只有一对,所以我在这里只有一个可能的排列,因此程序结束。

我试图弄清楚如何在python中做到这一点,但我最终只能在&#34;如果......那么......&#34;并且必须有一种更有效的方法。

对于那些好奇的人,我对此很感兴趣因为我失去了#34;我的密码。我的意思是,我的密码类似于&#34;我喜欢冰淇淋&#34;,但作为我负责的人,我用符号改变了一些角色,现在我不知道它是什么......

1 个答案:

答案 0 :(得分:4)

这并不完全符合您的要求,但它可能有所帮助:

from itertools import product

SUBSTITUTIONS = {
    "i": "!1|",
    "o": "0",
    "s": "$5",
}

def sub(text):
    possibilities = [c + SUBSTITUTIONS.get(c, "") for c in text]
    # 'spoils' -> ['s$5', 'p', 'o0', 'i!1|', 'l', 's$5']
    for subbed in product(*possibilities):
        print("".join(subbed))

它使用itertools.product()来迭代SUBSTITUTIONS的{​​{1}}的每个可能组合:

text

我已经重新格式化了输出的紧凑性,但你明白了。显然,候选密码的数量会随着替换次数呈指数级增长,但是你可以做的并不多。