2013-08-25 2 views
4

я пришел на этот пост: How to generate all permutations of a list in PythonPython перестановками включая подстрок

Но я требую чего-то большего, а именно все перестановок строки, а также все перестановки всех подстрок. Я знаю, что это большое число, но возможно ли это?

+1

Возможный дубликат: http://stackoverflow.com/questions/12273688/algorithm-to-generate-permutations-of-a-list -of-strings-and-their-substrings – bdean20

ответ

3
import itertools 

def all_permutations_substrings(a_str): 
    return (
     ''.join(item) 
     for length in xrange(1, len(a_str)+1) 
     for item in itertools.permutations(a_str, length)) 

Заметим, однако, что это истинные перестановки - как, hello будет иметь любую подстроку перестановку, которая имеет два l с в ней в два раза, так как l «s будет считаться„уникальным“. Если вы хотите, чтобы избавиться от этого, вы могли бы передать его через set():

all_permutations_no_dupes = set(all_permutations_substrings(a_str)) 
+0

Я просто попробую .. –

+0

Вы можете перебирать их (например, 'для результата в all_permutations_substrings (...)'), или вы можете передать его в 'list()' if вам просто нужен список. – Amber

+0

@AnshumanDwibhashi, вы можете сделать это: 'result = ['' .join (ele) для элемента в set (all_permutations_substrings ('hello'))]' – Akavall

1

Поскольку вопрос вы связаны состояния, itertools.permutations решение для генерации перестановок списков. В python строки можно рассматривать как списки, поэтому itertools.permutations("text") будет работать нормально. Для подстрок вы можете передать длину в itertools.permutations как необязательный второй аргумент.

def permutate_all_substrings(text): 
    permutations = [] 
    # All possible substring lengths 
    for length in range(1, len(text)+1): 
    # All permutations of a given length 
    for permutation in itertools.permutations(text, length): 
     # itertools.permutations returns a tuple, so join it back into a string 
     permutations.append("".join(permutation)) 
    return permutations 

Или, если вы предпочитаете один строки списковых

list(itertools.chain.from_iterable([["".join(p) for p in itertools.permutations(text, l)] for l in range(1, len(text)+1)]))