2012-06-21 127 views
12

我想編寫一個程序,將採取一個字符串的所有大寫,小寫和大小寫混合的組合,讓我們說"Fox",那麼它會顯示:查找字符串的

fox, Fox, fOx, foX, FOx, FoX, fOX, FOX 

到目前爲止我的代碼:

string = raw_input("Enter String: ") 
length = len(string) 
for i in range(0, length): 
    for j in range(0, length): 
     if i == j: 
      x = string.replace(string[i], string[i].upper()) 
      print x 

輸出至今:

Enter String: fox 
Fox 
fOx 
foX 
>>> 
+2

你被允許使用庫函數呢? – georg

+2

@thg:他沒有說這是家庭作業,所以顯然他想要最優雅的解決方案(這可能會涉及'itertools';) –

+0

是的。我被允許 – Whiskey

回答

23
>>> import itertools 
>>> map(''.join, itertools.product(*((c.upper(), c.lower()) for c in 'Fox'))) 
['FOX', 'FOx', 'FoX', 'Fox', 'fOX', 'fOx', 'foX', 'fox'] 

或者

>>> s = 'Fox' 
>>> map(''.join, itertools.product(*zip(s.upper(), s.lower()))) 
+0

打敗我吧! – beoliver

+0

非常好的解決方案。 –

+0

這很酷,但它需要一些解釋。 – Marcin

5

我一直想試試這個。

不知道這是否符合您的資格(它確實有效)。

str = raw_input() 
def getBit(num, bit): 
    return (num & 1 << bit) != 0 



for i in xrange(0,2**len(str)): 
    out = "" 
    for bit in xrange(0,len(str)): 
     if getBit(i,bit): 
     out += str[bit].upper() 
     else: 
     out += str[bit].lower() 

    print out 

這個想法是,當你在二進制中遞增時,你會得到1和0的每個可能的排列。

然後,您只需將1和0的這個列表轉換爲一個字符串,1表示大寫,0表示小寫。

1

一個襯墊使用列表理解:

from itertools import permutations 
strs='fox' 
combin=[''.join(x)for x in permutations(list(strs)+list(strs.upper()),3) if ''.join(x).lower()=='fox'] 
print(combin) 
['fox', 'foX', 'fOx', 'fOX', 'Fox', 'FoX', 'FOx', 'FOX'] 

使用for-in循環:

from itertools import permutations 
strs='fox' 
lis2=list(strs)+list(strs.upper()) 
for x in permutations(lis2,3): 
    if ''.join(x).lower()=='fox': 
     print(''.join(x)) 

fox 
foX 
fOx 
fOX 
Fox 
FoX 
FOx 
FOX 
+0

謝謝Ashwini..all帖子對我有幫助.. – Whiskey

1

這是優秀的,接受的答案被@ ephemient修改了一下。

的變化:以前大寫

  • 較低的情況下,只是這樣的名單與「狐狸」開頭,而不是「FOX」的

  • (問題的例子序列與「狐狸」開頭)

    使用列表理解,而不是map()的(無論哪種方式是好的,真的)

  • 爆發產生的小寫/大寫對使代碼更清晰

  • 將它打包成一個函數。

代碼:

import itertools as it 

def cap_permutations(s): 
    lu_sequence = ((c.lower(), c.upper()) for c in s) 
    return [''.join(x) for x in it.product(*lu_sequence)]