Python 查找字符串的所有大小写组合

Python 查找字符串的所有大小写组合,python,string,Python,String,我想写一个程序,它将接受一个字符串,比如说“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(strin

我想写一个程序,它将接受一个字符串,比如说
“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
迄今为止的产出:

输入字符串:fox
福克斯
狐狸
狐狸
>>> 

我一直想试试这个

不知道这是否符合你的条件(尽管它确实有效)

str=原始输入()
def getBit(num,bit):

使用列表理解返回(num&11行):

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

这是@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)]
使用乘积(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

虽然我尝试的是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;
    }
}
#包括
使用名称空间std;
字符串十二月(整数n,整数l)
{ 
字符串ret=“”;
对于(inti=l-1;i>=0;i--){
int k=n>>i;
if(k&1)
ret=ret+“1”;
其他的
ret=ret+“0”;
}
返回ret;
}
int main()
{
字符串x;
cin>>x;
转换(x.begin(),x.end(),x.begin(),::tolower);
int size=x.length();
串箱;

对于(int i=0;您允许为此使用库函数吗?@thg:他没有说这是家庭作业,所以显然他想要最优雅的解决方案(可能涉及
itertools
;)实际上,我通过itertools模型进行了研究……但这给出了一个排列,我在stackoverflow的其他帖子中看到了……但我需要的是将所有可能的大写和小写组合输出。这个问题几乎是:然而,这里的答案比另一个答案好得多,所以我我很高兴有人问我这个问题!
itertools
为了获胜。这回答了你的问题吗?这也很好。简单的解决方案。谢谢大家:)@NiklasB.可能吧,但这并不能让不熟悉每个元素的人更容易阅读。@Marcin:请随意添加解释。但是,我怀疑它是否会包含比所涉及函数的文档已经包含的内容更具启发性的信息。@Marcin:不,你可能知道,我经常回答P关于问题,如果我觉得有必要,我也会添加有用的解释。到目前为止,没有人抱怨。通常,人们需要的是必要的工具。通过提供像这个优秀答案中这样的一行,人们可以通过检查解决方案的作用来了解如何使用这些工具来实现目标。他们需要的研究理解一个解决方案是一个非常好的学习经历。当然,如果他们不理解一些东西,他们总是可以回来要求解释。@Marcin:我不同意。对于像我这样通常回答问题的人来说,这一定很有趣。对于学习一种新编程语言的人来说,这一定很有趣,也很有教育意义。我觉得探索新的语言结构非常有趣,所以我有时不想破坏这种体验。但这只是我个人的观点和方法,我对其他人的感受不一样很好。同样,协作也是如此,所以如果你觉得有必要,你应该加上一个解释。对这个答案没有足够的尊重。谢谢张贴它。
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
#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;
    }
}