2016-09-10 3 views
0

Ich habe den offensichtlichen Unterschied zwischen zwei Funktionen unten nicht gefunden. Die Frage ist also, wie die zweite Funktion doppelte Zeichen vergleicht und entfernt.welcher Code die doppelte Kombination in Permutation entfernen

Permutation für Nicht-Duplikat Zeichen

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'] 

Permutation für doppelte Zeichen

def permutations(string): 
    result = set([string]) 
    if len(string) == 2: 
     result.add(string[1] + string[0]) 
    elif len(string) > 2: 
     for i, c in enumerate(string): 
      for s in permutations(string[:i] + string[i + 1:]): 
       result.add(c + s) 
    return list(result) 
permutations('aabb'); 
['aabb', 'abab', 'abba', 'baab', 'baba', 'bbaa'] 

EDIT:

Die Funktion unterschiedliche Ergebnisse zurückgeben, wenn die Eingangs Duplikate enthält:

>>> permutations('aabb') 
['abab', 'baba', 'bbaa', 'abba', 'aabb', 'baab'] 
>>> perms('aabb') 
['aabb', 'aabb', 'abab', 'abba', 'abab', 'abba', 'aabb', 'aabb', 'abab', 
'abba', 'abab', 'abba', 'baab', 'baba', 'baab', 'baba', 'bbaa', 'bbaa', 
'baab', 'baba', 'baab', 'baba', 'bbaa', 'bbaa'] 

Antwort

2

Der Unterschied ist sehr einfach. Die zweite Funktion speichert Ergebnisse in einem Satz:

result = set([string]) 

Ein Satz enthält niemals Duplikate. Wenn Sie einen doppelten Wert zu einem Satz hinzuzufügen, die Feststellung, passiert:

>>> set([1, 2, 3, 2, 3, 2, 1]) 
set([1, 2, 3]) 

Am Ende die Funktion eine Liste aus dem Satz erzeugt, so dass der Satz ist nicht von außen sichtbar:

return list(result) 
+0

Groß ! Das hilft mir sehr! Vielen Dank! –