2016-06-23 12 views
-3

Ich habe eine Liste voller Buchstaben wie li = ["m", "i"] und ich möchte eine Liste von Tupeln als permutierten Form zurückzukehren ohne Bibliotheken folgend zu verwenden,Wie gebe ich eine Liste von Tupeln als permutiertes Formular aus einer Liste von Buchstaben mit merge sort zurück?

[("m", "i"), ("i", "m")] 

Ich versuche, mit Rekursion Mergesort zu verwenden, um Lösen Sie dieses Problem jedoch, das nicht die richtige Ausgabe zurückgibt. Mein Programm unten vorgesehen ist,

def permutation1(lis): 

    res = [] 

    if len(lis) == 1: 
     res.append(lis) 

    elif len(lis) > 1: 

     last_index = len(lis) -1 
     last = lis[last_index] 
     rest = lis[:last_index] 

     if rest is not None and last is not None: 
      res.append(merge(permutation1(rest), last)) 

    return res 


def merge(lis, c): 

    res = [] 

    for s in lis: 
     for i in range(len(s)+1): 

      ps = s[:i]+ list(c) + s[i:] 
      value = tuple(list(ps)) 

      # print value 
      res.append(value) 

    return res 

Zum Beispiel mit Eingang von ["m", "i", "b"], ich Ausgabe als [[('b', ('i', 'm'), ('m', 'i')), (('i', 'm'), 'b', ('m', 'i')), (('i', 'm'), ('m', 'i'), 'b')]], die nicht korrekt ist. Wie kann ich das Programm so verbessern, dass ich wie erwartet laufe?

+5

Does [ 'itertools.permutations'] (https://docs.python.org/2.7/library/ itertools.html # itertools.permutations) hilft Ihnen alles? – Ian

+0

@mwormser Ich möchte keine Bibliotheken verwenden. Ich versuche, richtig zu lernen, wie Rekursion und Mer-Sortierung zusammenarbeiten, indem wir dieses Problem lösen. Es hilft dir für abstraktes Denken. – Arefe

+4

Das wäre eine gute Sache, in Ihre Frage aufzunehmen. – glibdud

Antwort

1

Versuchen Sie dies.

from itertools import permutations 
[i for i in permutations(li,2)] 

Ergebnis

[('m', 'i'), ('i', 'm')] 

Hier ist ohne permutations

In [32]: [k for k in [(i,li[j])for i in li for j in range(2)] if len(set(k)) != 1] 
Out[32]: [('m', 'i'), ('i', 'm')] 
+0

Ich möchte keine Bibliotheken verwenden und in der ursprünglichen Frage erwähnt. – Arefe

+0

@Arefe Meine Antwort aktualisiert. –

+0

Danke, aber ich möchte den Code in der Frage korrigieren. – Arefe