查找字符串的所有大写、小写和混合大小写组合



我想编写一个接受字符串的程序,假设"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
>>> 
import itertools
s = 'Fox'
map(''.join, itertools.product(*zip(s.upper(), s.lower())))
>>> ['FOX', 'FOx', 'FoX', 'Fox', 'fOX', 'fOx', 'foX', 'fox']
我一直

想试试这个。

不知道这是否符合您的资格(尽管它确实有效)。

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

这是

经过@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)]

使用列表理解的一行

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 循环:

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

使用乘积(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

我结合了@ephemient的解决方案,@steveha的解决方案和我自己的调整。

def allcasecombinations(s):
    return list({''.join(x) for x in itertools.product(*zip(s.upper(), s.lower()))})

我的改进是使用集合,然后将其转换为列表。 该集合是删除重复项:例如,如果您的字符串有标点符号,则原始函数将具有重复项(因为" ".upper() == " ".lower() )。我合并了@steveha的工作,因为我认为在集合中使用列表理解比list(set(map(itertoolsmagic)))更干净。对于大多数用例,列表转换可能不是必需的,但我添加它是为了安全起见。

>>> allcasecombinations("hi!")
['HI!', 'hI!', 'Hi!', 'hi!']

虽然我尝试的是 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;
    }
}

假设"狗"这个词...因此,将有 2^(字母数),即 2^3=8 组合。因此,在这个程序中,我们从 0-7 迭代并将迭代器(在本例中为 i)转换为二进制,例如,第五次迭代二进制将是 101,然后结果单词将是 DoG(以 1 为大写,0 为小写)。像这样,您可以获得所有 2^n 个结果单词。

最新更新