2013-11-24 61 views
1

我有一個字符串str1 =「ABC」,除了最後一個位置,我需要在字符串str1中插入0到len(str1)數字「x」。使用Python生成兩個字符串的組合

因此,在上面的例子中,我想用0至2「×」的所得清單放置之前或它看起來像

["ABC", 
"xABC", 
"AxBC", 
"ABxC", 
"xxABC", 
"xAxBC", 
"xABxC", 
"AxxBC", 
"AxBxC", 
"ABxxC"] 

我嘗試了一些代碼是作爲字符串內如下(I做意識到我錯過了這幾個組合):

>>> for i in range(1, len(str1)): 
...  for k in range(len(str1)): 
...   str1[:k]+"x"*i+str1[k:] 
... 
'xABC' 
'AxBC' 
'ABxC' 
'xxABC' 
'AxxBC' 
'ABxxC' 
>>> 

我不是很確定如何處理另一種情況與兩者之間的兩個之間留下例如xAxBC等

解決此問題的最佳方法是什麼?

+0

的可能重複[如何找到字符串的排列?蟒蛇](http://stackoverflow.com/questions/20140144/how-to-find-the-permutations-of-string-python) – alko

+0

@alko感謝您指出。但是問題不一樣。 –

回答

4

使用itertools.combinations_with_replacement獲得指標插入x小號:

import itertools 

str1 = "ABC" 
lst = list(str1) 
for n in range(len(str1)): 
    for idxs in itertools.combinations_with_replacement(range(len(str1)), n): 
     xs = lst[:] 
     for i in reversed(idxs): # Use reversed, otherwise index become invald 
      xs.insert(i, 'x') 
     print(''.join(xs)) 

輸出:

ABC 
xABC 
AxBC 
ABxC 
xxABC 
xAxBC 
xABxC 
AxxBC 
AxBxC 
ABxxC 
+2

哇,你太快了,我花了很長時間才發現它叫什麼。以下是參考資料:http://en.wikipedia.org/wiki/Combination#Number_of_combinations_with_repetition –

+0

感謝您的驚人答案!雖然這似乎很好地適用於長度高達10-15的字符串,但對於較大的數字,它變得極其緩慢。有什麼可以加速的嗎?例如memoization? 當x在xxABC,xAxBC,xABxC等開頭被添加時,我正在嘗試(xABC,AxBC,ABxC)重複的行。 –