2012-06-21 2 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 

Идея заключается в том, что, как вы увеличиваете в двоичной системе, вы получаете все возможные перестановки 1s и 0s.

Затем вы просто конвертируете этот список из 1s и 0s в строку, 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'] 

используя для в цикле:

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

Это отличный, принятый ответ на @ эфемер немного модифицирован.

Изменения:

  • строчные перед тем заглавными буквами, просто так что список начинается с «лисы» вместо «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)] 
Смежные вопросы