查找字符串的所有上,下和混合大小写组合

时间:2012-06-21 18:22:30

标签: python string

我想编写一个带字符串的程序,比方说"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
>>> 

6 个答案:

答案 0 :(得分:29)

>>> 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())))

答案 1 :(得分:6)

我一直想尝试这个。

不知道这是否符合您的资格要求(虽然确实有效)。

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表示小写。

答案 2 :(得分: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

答案 3 :(得分:1)

这是@ephemient修改过的优秀,可接受的答案。

的变化:

  • 大写之前的小写,只是因为列表以“fox”而不是“FOX”开头(问题的示例序列以“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)]

答案 4 :(得分:1)

使用乘积(False,True)查找字符串中上下更改字符的任何排列

def capitalize_char_permutation (string:str) -> str :
    conditions = product((0,1), repeat=len(string))
    for i in conditions:
        result = ''
        for j in range(len(i)):
            if i[j]==0 :
                result+= string[j].lower()
            else:
                result+= string[j].upper()
        yield result

答案 5 :(得分:0)

尽管我尝试的是c ++,但我想您会明白的。我陷入了同样的问题,于是我四处搜寻,这就是我最终写的内容……我知道它并不完美,如果有人能帮助我更好地编写代码并指出错误,我将不胜感激。

#include <bits/stdc++.h>

using namespace std;

string decToBinary(int n,int l) 
{ 
    string ret="";
    for (int i = l-1; i >= 0; i--) { 
        int k = n >> i; 
        if (k & 1) 
            ret=ret+"1"; 
        else
            ret=ret+"0";
    }
    return ret; 
}

int main()
{
    string x;
    cin>>x;
    transform(x.begin(), x.end(), x.begin(), ::tolower); 
    int size=x.length();
    string bin;
    for(int i=0;i<pow(2,size);i++)
    {
        bin=decToBinary(i,size);
        for(int j=0;j<size;j++)
        {
            if(bin[j]=='1')
                cout<<(char)(x[j]-32);
            else
                cout<<x[j];
        }
        cout<<endl;
    }
}

假设单词“ dog” ...如此,将有2 ^(字母数),即2 ^ 3 = 8个组合。因此,在此程序中,我们从0-7进行迭代,并将迭代器(在这种情况下为i)转换为二进制,例如,以第五次迭代将二进制为101,然后将得到的字为DoG(以1为大写)和0作为小写)。这样,您可以获得所有2 ^ n个合成词。