2016-04-30 11 views
1

Follow-up-Frage: Python swap indexes using slicesSwap Scheiben von Indizes mit einer Funktion

r = ['1', '2', '3', '4', '5', '6', '7', '8'] 

Wenn ich Scheiben tauschen will, eine Funktion, was wäre die richtige Methode?

def swap(from,to): 
    r[a:b+1], r[c+1:d] = r[c:d], r[a:b] 

swap(a:b,c:d) 

Ich möchte die Zahlen 3 + 4 mit 5 + 6 + 7 in r tauschen:

swap(2:4,4:7) 

Ist das richtig?

+1

Es sollte funktionieren, wenn es richtig gemacht wird, dh ohne all diese Syntaxfehler ('from' kann nicht als Variablenname verwendet werden und' 2: 4,4: 7' ist nicht wie man schneidet) – DeepSpace

Antwort

7

Ohne Berechnung können Sie tun:

def swap(r,a,b,c,d): 
    assert a<=b<=c<=d 
    r[a:d]=r[c:d]+r[b:c]+r[a:b] 
+0

Schön, unkompliziert, effektiv Ansatz. – TigerhawkT3

+0

Wenn die Frage nur gewesen wäre, "wie tausche ich Abschnitte einer Liste aus?" Ich hätte etwas wie 'return r [: a] + r [c: d] + r [b: c] + r [a: b] + r [d:]' gemacht, aber ich blieb bei der Scheibe stecken Aufgabe Entpacken. Diese Antwort kombiniert den einfachen Ansatz mit einer speichersparenden In-Place-Slice-Zuweisung für die wahrscheinlich optimale Kombination aus Effizienz und Einfachheit. – TigerhawkT3

1

Eine interessante (aber albern, ist die von BM deutlich besser) Lösung, die ein Objekt zu erstellen, wäre das Slicing unterstützt:

class _Swapper(object): 
    def __init__(self, li): 
     self.list = li 

    def __getitem__(self, item): 
     x = list(item) 
     assert len(x) == 2 and all(isinstance(i) for i in x) 
     self.list[x[0]], self.list[x[1]] = self.list[x[1]], self.list[x[0]] 

def swap(li): 
    return _Swapper(li) 

swap(r)[a:b, c:d] 
Verwandte Themen