我想编写一个接受字符串的程序,假设"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 个结果单词。