web-dev-qa-db-fra.com

Toutes les permutations d'une chaîne en Python (récursive)

J'ai besoin d'un coup de pied dans la tête sur celui-ci. J'ai la fonction récursive suivante définie:

def perms(s):
  if(len(s)==1):
    return s

  res = ''
  for x in xrange(len(s)):

    res += s[x] + perms(s[0:x] + s[x+1:len(s)])

  return res + '\n'

perms ("abc") renvoie actuellement:

abccb
bacca
cabba

Le résultat souhaité est

abc
acd
bac
bca
cab
cba

Où est-ce que je vais mal ici? Comment puis-je penser à cela différemment pour trouver la solution?

Remarque: Je connais la fonction itertools. J'essaie de comprendre comment mettre en œuvre des permutations de manière récursive pour mon propre apprentissage. C'est pourquoi je préférerais que quelqu'un indique ce qui ne va pas dans mon code et comment penser différemment pour le résoudre. Merci!

9
gnp210

Voilà (permutation récursive):

def Permute(string):
    if len(string) == 0:
        return ['']
    prevList = Permute(string[1:len(string)])
    nextList = []
    for i in range(0,len(prevList)):
        for j in range(0,len(string)):
            newString = prevList[i][0:j]+string[0]+prevList[i][j:len(string)-1]
            if newString not in nextList:
                nextList.append(newString)
    return nextList

Pour obtenir une liste de toutes les chaînes de permutation, appelez simplement la fonction ci-dessus avec votre chaîne d'entrée. Par exemple,

stringList = Permute('abc')

Pour obtenir une chaîne unique de toutes les chaînes de permutation séparées par des caractères de nouvelle ligne, appelez simplement '\n'.join avec le résultat de cette fonction. Par exemple,

string = '\n'.join(Permute('abc'))

Par ailleurs, les résultats print pour les deux options ci-dessus sont identiques.

14
barak manos

Le résultat des permutations sera une collection, disons une liste. Votre code sera plus propre si vous pensez ainsi et si nécessaire, vous pouvez joindre les résultats en une seule chaîne. Un exemple simple sera

def perms(s):        
    if(len(s)==1): return [s]
    result=[]
    for i,v in enumerate(s):
        result += [v+p for p in perms(s[:i]+s[i+1:])]
    return result


perms('abc')

['abc', 'acb', 'bac', 'bca', 'cab', 'cba']


print('\n'.join(perms('abc')))

abc
acb
bac
bca
cab
cba
10
karakfa

Pas sûr de l'efficacité mais ça devrait marcher aussi.

def find_permutations(v):
    if len(v) > 1:
        for i in perms(v):
            nv = i[1:]
            for j in perms(nv):
                print(i[0] + j)
    else:
        print(v)


def perms(v):
    if not hasattr(perms, 'original'):
        perms.original = v
        perms.list = []
    nv = v[1:] + v[0]
    perms.list.append(nv)
    if perms.original == nv:
        l = perms.list
        del perms.original
        del perms.list
        return l
    return perms(nv)

find_permutations('abc')
0
Brent Douglas

Voici le code:

def fperms(elements):
    if len(elements)<=1:
        yield elements
    else:
        for p in fperms(elements[1:]):
            for i in range(len(elements)):
                yield p[:i]+elements[0:1]+p[i:]
0
apoorva R