2012-06-21 36 views
12

bir dize tüm üst, alt ve karışık durum kombinasyonları bul, en "Fox" diyelim, o zaman gösterir:Bir dize alacağını bir program yazmak istiyorum

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

Kodum şimdiye kadar:

Bugüne kadar
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 

Çıktı:

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

Bunun için kütüphane işlevlerini kullanmaya izin var mı? – georg

+2

@thg: O ev ödevi olduğunu söylemedi, bu yüzden en zarif çözümü (muhtemelen itertools'u içerecektir;) –

+0

evet. İzin verdim – Whiskey

cevap

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

Ya

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

beni buna dövdü! – beoliver

+0

Çok hoş bir çözüm. –

+0

Bu harika, ancak bazı açıklama gerektirir. – Marcin

5

Bunu her zaman denemek istedim.

Bu sizin niteliklerinize uyup uymadığı hakkında bir fikir yok (yine de çalışıyor).

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 

fikir ikilik sistemde artırmak gibi, sen 1 ve 0'ların olası her permütasyon elde ediyoruz.

Ardından, 1'ler ve 0'ların bu listesini bir dizgeye dönüştürüyorsunuz, 1 büyük harf, 0 küçük harf anlamına gelir.

1

bir liner kullanılarak liste anlama:

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'] 

kullanarak-için de döngü:

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

Teşekkürler Ashwini..all Mesajlar bana yardımcı oldu .. – Whiskey

1

Bu mükemmel kabul cevabı @ gereğidir Ephemient biraz değiştirildi.

değişiklikler: Büyük harf önce

  • küçük harf, sadece bu yüzden listesi "FOX" yerine "tilki" ile başlar

  • (Sorunun örnek dizisi "tilki" ile başlar) yerine map() listesi anlama

    kullanımı

  • büyük/küçük çiftleri yapmak için üretir kodu patlak (her iki durumda da gerçekten iyidir) daha net

  • , bir işlev haline getirmiştir.

kodu:

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)] 
İlgili konular