Подтвердить что ты не робот

Найдите все комбинации верхних, нижних и смешанных комбинаций строки

Я хочу написать программу, которая возьмет строку, скажем "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
>>> 
4b9b3361

Ответ 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)]