我写了嵌套循环,给了我所有可能的字母表字母排列,一次取4个字母。
def permutation():
import string
alphabet = string.ascii_lowercase
perm = []
for item1 in alphabet:
for item2 in alphabet:
for item3 in alphabet:
for item4 in alphabet:
perm += [item1 + item2 + item3 + item4]
return perm
所以,当我做的时候
permutation()
我得到了
['aaaa',
'aaab',
'aaac',
'aaad',
'aaae',
...
'zzzz']
虽然这解决了我的特殊问题(4位置换),但这不是一个简洁的解决方案。此外,如果我想进行n位排列(例如10位数),嵌套循环将是一团糟。
所以,我想我可以告诉我如何将这个嵌套循环实现为某种函数,使用递归或类似的东西。
顺便说一下,我知道在这个特殊问题(4位排列)中,我可以使用python库:
def permutation():
from itertools import product
import string
alphabet = string.ascii_lowercase
perm = [ ''.join(p) for p in list(product(list(alphabet),repeat = 4)) ]
return perm
这就是我在现实生活中会使用的东西,但在这里我想弄清楚一次用n个字母输入字母表的排列算法。
答案 0 :(得分:0)
首先,将其分解为递归的两个基本点:退化步骤(最终条件)和递归步骤。在这里,我们的最终条件是当我们想要长度为1的字符串时返回字母表。
对于较长的字符串(长度为n),将字母表中的每个字母前置为长度为n-1的所有排列。
import string
alphabet = string.ascii_lowercase
def permutation(n):
return [c for c in alphabet] if n == 1 \
else [c + n_perm for c in alphabet for n_perm in permutation(n-1)]
print permutation(1)
print permutation(2)
答案 1 :(得分:0)
如果你想进行N位数排列(比方说10位数),我想出两种方法:
1)将重复10分解为5 + 5(或3 + 3 + 4):
from itertools import product
import string
alphabet = string.ascii_lowercase
def permutation( * repeat):
for p1 in product(list(alphabet),repeat = repeat[0]):
for p2 in product(list(alphabet),repeat = repeat[1]):
yield ''.join(p1 + p2)
permutation(5, 5)
2)只需选择重复10,如:
from itertools import product
import string
alphabet = string.ascii_lowercase
def permutation( repeat):
for p in product(list(alphabet), repeat=repeat):
yield ''.join(p)
for word in permutation (10): print word