您可以使用itertools.product计算值列表的笛卡尔积,例如获取所有可能的组合。
如果你想保持字母顺序,你需要生成一个这样的组合数组:
[['e', 'E', 'ee', 'eE', 'Ee', 'EE'], ['t', 'T', 'tt', 'tT', 'Tt', 'TT'], ['h', 'H', 'hh', 'hH', 'Hh', 'HH'], ['i', 'I', 'ii', 'iI', 'Ii', 'II'], ['o', 'O', 'oo', 'oO', 'Oo', 'OO'], ['p', 'P', 'pp', 'pP', 'Pp', 'PP'], ['i', 'I', 'ii', 'iI', 'Ii', 'II'], ['a', 'A', 'aa', 'aA', 'Aa', 'AA']]
然后使用以下方法处理所有可能的组合itertools.product
:
import itertools
eth_chars = list("ethiopia")
max_length = 2
combinations = []
for idx,character in enumerate(eth_chars):
char_arr= [] # ['ee','e','E','EE','eE','Ee']
char_arr.append(eth_chars[idx]) #add 'e'
char_arr.append(eth_chars[idx].upper()) #add 'E'
for item in itertools.product(eth_chars[idx] + eth_chars[idx].upper(), repeat=max_length):
char_arr.append("".join(list(item))) #add any combination 'eE', 'EE', 'Ee'
combinations.append(char_arr) # [['ee','e','E','EE','eE','Ee']]
print(combinations)
for element in itertools.product(*combinations):
print("".join(element))
在 repl.it 上试试这个
注意 :
- 上面的方法假设您希望字母顺序正确,而不是处理排列
- 仅当 max_length=2 时,它返回 1 679 616 个组合,如果删除大写组合(
eE
和Ee
),您将有 65 536 个组合,如下所示:
import itertools
eth_chars = list("ethiopia")
max_length = 2
combinations = []
for idx,character in enumerate(eth_chars):
char_arr= [] # ['ee','e','E','EE','eE']
for count in range(0,max_length):
char_arr.append(eth_chars[idx]*(count+1))
char_arr.append(eth_chars[idx].upper()*(count+1))
combinations.append(char_arr) # [['ee','e','E','EE']]
for element in itertools.product(*combinations):
print("".join(element))