Python Permutation一次采取

时间:2016-01-14 21:35:58

标签: loops python-3.x recursion permutation

我写了嵌套循环,给了我所有可能的字母表字母排列,一次取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个字母输入字母表的排列算法。

2 个答案:

答案 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