2016-04-30 7 views
2

Ich weiß, dass Sie 2 Einzel Indizes in Python tauschenSwap-Indizes mit Slices?

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

Ausgang:

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

Aber warum kann man nicht tauschen 2 Scheiben Indizes in Python?

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

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

r[2:4], r[4:7] = r[4:7], r[2:4] 

output:

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

erwartete Ausgabe:

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

Was habe ich falsch gemacht? Ausgabe:

+0

Sieht aus wie Sie gerade ein Off-by-one haben Error? – TigerhawkT3

Antwort

1

Das Schneiden funktioniert so wie es soll. Sie ersetzen Scheiben unterschiedlicher Länge. r[2:4] ist zwei Elemente und r[4:7] ist drei Elemente.So

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

wenn ['3', '4'] ersetzt wird, kann es nur passen ['5', '6'], und wenn ['5', '6', '7'] ersetzt wird, es wird nur ['3', '4']. So haben Sie ['1', '2',, dann sind die nächsten beiden Elemente die ersten beiden Elemente aus ['5', '6', '7'], die nur ['5', '6' ist, dann gehen die beiden Elemente von ['3', '4' weiter, dann die restlichen '7', '8'].

Wenn Sie die Scheiben ersetzen möchten, müssen Sie Scheiben an den richtigen Stellen beginnen und für jede Schicht eine geeignete Größe in dem Array zuweisen:

>>> r = ['1', '2', '3', '4', '5', '6', '7', '8'] 
>>> r[2:5], r[5:7] = r[4:7], r[2:4] 
>>> r 
['1', '2', '5', '6', '7', '3', '4', '8'] 
old index: 4 5 6 2 3 
new index: 2 3 4 5 6 
+0

Danke. Ich dachte, swapping fügt die Scheiben in die Liste ein. Ich möchte eine Funktion erstellen, die angibt, welche Slices ausgetauscht werden sollen, aber wenn ich Ihre Antwort lese, ist das nicht möglich. – Reman

+0

@Reman Welche Art von Funktion haben Sie sich vorgestellt? Hast du eine grobe Skizze? Obwohl ich denke, dass es besser wäre, das alles in einer separaten Frage zu stellen. – AKS

+0

@Reman Ich denke, es sollte eine separate Frage insgesamt und keine Bearbeitung in diesem sein. – AKS

1

Denken Sie daran:

r[2:4], r[4:7] = r[4:7], r[2:4] 

ähnlich wie folgt aus:

original_r = list(r) 
r[2:4] = original_r[4:7] 
r[4:7] = original_r[2:4] 

Also, durch die Zeit, um es in die dritte Zeile das bekommt, ist das vierte Element nicht was du denkst es ist mehr ... Du hast '3', '4' durch '5', '6', '7' ersetzt, und jetzt beginnt die [4:7] Scheibe mit dieser '7'.

+0

Die Entpackungszuweisung funktioniert tatsächlich an Ort und Stelle, z. 'a = 1; b = 2; a, b = b, a + b 'haben ein anderes Ergebnis als "a = 1; b = 2; a = b; b = a + b'. – TigerhawkT3

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

In Ihrem Code:

>>> r[2:4], r[4:7] = r[4:7], r[2:4] 

Sie r[4:7] zuweisen, die drei Elemente zu r[2:4] haben die 2.

Im Code nur habe ich geschrieben:

>>> >>> r[2:5], r[5:7] = r[4:7], r[2:4] 

r[4:7] Das ist ['5', '6', '7'], ersetzt r[2:5] die ['1', '2', '5', '6', '7', '6', '7', '8']

in resultierenden ['3', '4', '5']

r ist und dann:

r[2:4] die ['3', '4'] war, ersetzt r[5:7] die ['6', '7']

So Endergebnisses Wesen ist:

['1', '2', '5', '6', '7', '3', '4', '8'] 
Verwandte Themen