26

我想编写一个程序,它需要一个字符串,比如说"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
>>> 
4

6 回答 6

50
import itertools

s = 'Fox'
map(''.join, itertools.product(*zip(s.upper(), s.lower())))
>>> ['FOX', 'FOx', 'FoX', 'Fox', 'fOX', 'fOx', 'foX', 'fox']
于 2012-06-21T18:32:20.057 回答
7

我一直想试试这个。

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

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

于 2012-06-21T18:30:46.280 回答
3

这是@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)]
于 2012-06-23T00:13:42.173 回答
2

一个使用列表理解的班轮:

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
于 2012-06-21T18:35:39.483 回答
1

使用 product (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
于 2018-10-09T07:31:52.853 回答
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;
    }
}

假设“狗”这个词……那么,将有 2^(字母数),即 2^3=8 组合。因此,在这个程序中,我们从 0 到 7 进行迭代,并将迭代器(在本例中为 i)转换为二进制,例如,进行第五次迭代,二进制为 101,则结果单词为 DoG(以 1 为大写和 0 作为小写)..这样你可以得到所有 2^n 结果词。

于 2020-04-20T09:02:20.703 回答