Найдите все комбинации верхних, нижних и смешанных комбинаций строки
Я хочу написать программу, которая возьмет строку, скажем "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
>>>
Ответы
Ответ 1
>>> 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())))
Ответ 2
Я всегда хотел попробовать это.
Не знаю, соответствует ли это вашей квалификации (это действительно работает).
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 означает строчный регистр.
Ответ 3
один лайнер с использованием понимания списка:
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
Ответ 4
Это отличный, принятый ответ от @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)]