2014-04-18 25 views
4

我知道怎麼去只是普通字符串的排列在python:如何獲得每個字符串的排列?

>>> from itertools import permutations 
>>> perms = [''.join(p) for p in permutations('stack')] 
>>> print perms 
... 

但我怎麼會得到的排列'stac''stak''sack''stck''stc''st',等等?我所需的輸出是:

>>> permutations('pet') 
['pet', 'pte', 'ept', 'etp', 'tpe', 'tep', 'pe', 'ep', 'p', 'e', 't', 'pt', 'tp', 'et', 'te'] 

我有這麼遠:但是

>>> perm('pet') 
[[['t'], ['e'], ['p']], [['t', 'e'], ['e', 't'], ['e', 'p'], ['t', 'p'], ['p', 't'], ['p', 'e'], ['p', 'p']], [['t', 'e', 'p'], ['e', 't', 'p'], ['e', 'p', 't'], ['e', 'p', 'p'], ['t', 'p', 'e'], ['p', 't', 'e'], ['p', 'e', 't'], ['p', 'e', 'p'], ['t', 'p', 'p'], ['p', 't', 'p'], ['p', 'p', 't'], ['p', 'p', 'e']]] 
>>> 

,它有一堆名單列表,並與價值觀:

def permutate(values, size): 
    return map(lambda p: [values[i] for i in p], permutate_positions(len(values), size)) 

def permutate_positions(n, size): 
    if (n==1): 
    return [[n]] 
    unique = [] 
    for p in map(lambda perm: perm[:size], [ p[:i-1] + [n-1] + p[i-1:] for p in permutate_positions(n-1, size) for i in range(1, n+1) ]): 
    if p not in unique: 
     unique.append(p) 
    return unique 

def perm(word): 
    all = [] 
    for k in range(1, len(word)+1): 
    all.append(permutate([' ']+list(word), k)) 
    return all 

這種形式運行像['p','p','t']!

我該怎麼做?任何幫助表示讚賞。

+0

有本網站的幾個這樣的例子。嘗試搜索。 – devnull

+0

看看['itertools.permutations'](https://docs.python.org/2/library/itertools.html#itertools.permutations)。 – BrenBarn

回答

8

這是itertools.permutations做的一種方式:

from itertools import permutations 
s = 'pet' 
print [''.join(p) for i in range(1, len(s)+1) for p in permutations(s, i)] 

輸出:

['p', 'e', 't', 'pe', 'pt', 'ep', 'et', 'tp', 'te', 'pet', 'pte', 'ept', 'etp', 'tpe', 'tep'] 
相關問題