如何在Python中获取字符串的所有字母排列及其大小写?
如何在Python中获取一个字符串的所有可能的字母大小写组合?
举个例子:
输入:'ab' 输出:'aB', 'Ba', 'BA', 'Ab', 'AB', 'bA'
输入:'dan' 输出:'aND', 'ANd', 'Dna', 'naD', 'DaN', 'aDn', 'Adn', 'dnA', 'NdA', 'anD', 'DnA', 'NAD', 'nAD', 'Dan', 'NDA', 'nAd', 'AdN', 'DAn', 'AnD', 'And', 'DNA', 'daN', 'adN', 'nDa', 'dAN', 'dNa', 'aDN', 'ADN', 'dNA', 'Nda', 'AND', 'DNa', 'NaD', 'Nad', 'aNd', 'nDA', 'dAn', 'NAd', 'ndA', 'NDa', 'ADn', 'DAN'
3 个回答
1
把 itertools.permutations
和 itertools.product
结合起来:
from itertools import permutations, product
def perm_with_case(word):
cased = product(*zip(word.lower(), word.upper()))
next(cased) # throw away the all-lowercase result
return (''.join(p) for w in cased for p in permutations(w))
得到的结果是
>>> list(perm_with_case("ab"))
['aB', 'Ba', 'Ab', 'bA', 'AB', 'BA']
>>> list(perm_with_case("dan"))
['daN', 'dNa', 'adN', 'aNd', 'Nda', 'Nad', 'dAn', 'dnA', 'Adn', 'And', 'ndA', 'nAd', 'dAN', 'dNA', 'AdN', 'ANd', 'NdA', 'NAd', 'Dan', 'Dna', 'aDn', 'anD', 'nDa', 'naD', 'DaN', 'DNa', 'aDN', 'aND', 'NDa', 'NaD', 'DAn', 'DnA', 'ADn', 'AnD', 'nDA', 'nAD', 'DAN', 'DNA', 'ADN', 'AND', 'NDA', 'NAD']
这个结果看起来符合我们想要的输出,虽然我承认我不太明白为什么要把全小写的值去掉。
1
你可以使用itertools.product这个函数来实现。想了解更多,可以去看看这个链接:https://docs.python.org/2/library/itertools.html
这里有个例子:
def combos(s):
combolist = []
for i in range(len(s)):
combolist.append([])
for i in range(len(s)):
combolist[i].append(s[i].lower())
combolist[i].append(s[i].upper())
return list(itertools.product(*combolist))
输出结果是:
combos('ab')
>>> [('a', 'b'), ('a', 'B'), ('A', 'b'), ('A', 'B')]
combos('dan')
>>> [('d', 'a', 'n'), ('d', 'a', 'N'), ('d', 'A', 'n'), ('d', 'A', 'N'), ('D', 'a', 'n'), ('D', 'a', 'N'), ('D', 'A', 'n'), ('D', 'A', 'N')]
从这里开始,你可以很容易地进行格式化。
1
这可以通过使用itertools来实现。
from itertools import permutations
def perm(word):
perms = [''.join(p) for p in permutations(word)]
print(perms)
return perms
def capPer(arrPerm):
result=[]
for val in arrPerm:
wordList=list(val)
for i,letter in enumerate(wordList):
wordList[i]=letter.upper()
result.extend(perm(''.join(wordList)))
return set(result)
def combi(wrd):
print(capPer(perm(wrd)))
combi('ab')
combi('dan')
**output:**
set(['aB', 'Ba', 'BA', 'Ab', 'AB', 'bA'])
set(['aND', 'ANd', 'Dna', 'naD', 'DaN', 'aDn', 'Adn', 'dnA', 'NdA', 'anD', 'DnA', 'NAD', 'nAD', 'Dan', 'NDA', 'nAd', 'AdN', 'DAn', 'AnD', 'And', 'DNA', 'daN', 'adN', 'nDa', 'dAN', 'dNa', 'aDN', 'ADN', 'dNA', 'Nda', 'AND', 'DNa', 'NaD', 'Nad', 'aNd', 'nDA', 'dAn', 'NAd', 'ndA', 'NDa', 'ADn', 'DAN'])