Ga naar hoofdinhoud

5.4 Bouwsteen 2 — twee elementen ruilen

Leerdoel: je kunt twee elementen in een lijst van plek wisselen zonder een waarde te verliezen.

Wat we willen

Twee elementen in een lijst van plaats laten ruilen. Bijvoorbeeld:

[5, 2, 8, 1, 4] → swap index 0 en 3 → [1, 2, 8, 5, 4]

Een veelgemaakte beginnersfout

Probeer dit te volgen. Wat denk je dat eruit komt?

lijst = [5, 2, 8, 1, 4]
lijst[0] = lijst[3]
lijst[3] = lijst[0]
print(lijst)
Antwoord — verwacht je dit?
[1, 2, 8, 1, 4]

De 5 is weg. En de 1 staat twee keer.

Wat ging er mis? Regel-voor-regel:

  • lijst[0] = lijst[3]lijst[0] (5) wordt overschreven met lijst[3] (1). Lijst is nu [1, 2, 8, 1, 4]. De 5 bestaat niet meer.
  • lijst[3] = lijst[0]lijst[3] wordt lijst[0] (nu 1). Geen verandering.

De eerste toekenning maakte de 5 onbereikbaar.

Oplossing 1 — een tijdelijke variabele

Bewaar de waarde die je gaat overschrijven in een tijdelijke variabele:

tijdelijk = lijst[0]
lijst[0] = lijst[3]
lijst[3] = tijdelijk

Drie regels. Werkt op alle programmeertalen.

Oplossing 2 — Pythonisch: tuple-swap

Python heeft een veel kortere notatie:

lijst[0], lijst[3] = lijst[3], lijst[0]

Eén regel. Python evalueert eerst de rechterkant tot een tuple (lijst[3], lijst[0]) en kent die dan toe aan de linkerkant. Geen informatieverlies, want de waardes zijn al in het tuple opgeslagen voor de overschrijving begint.

Voorspel

Wat denk je dat dit print?

lijst = [5, 2, 8, 1, 4]
lijst[0], lijst[3] = lijst[3], lijst[0]
print(lijst)
Antwoord
[1, 2, 8, 5, 4]

lijst[0] en lijst[3] zijn netjes geruild. Geen waarde verloren.

Run

Python
Code-omgeving wordt voorbereid…

Experimenteer

Probeer ook met de tijdelijke-variabele versie. Zelfde resultaat?

Python
Code-omgeving wordt voorbereid…

Bouwsteen model

Twee plekken ruilen

Swap twee indexen zonder een waarde kwijt te raken.

Stap 6/26Vergelijkingen 5Swaps 0Resultaat -
05i
12
28
31min
44j
Scan index 4

4 is niet kleiner dan de huidige minimum-kandidaat.

Bij een swap wisselen twee cellen tegelijk van rol.

Feedback
voorste met kleinste

Input swap([5, 2, 8, 1, 4], 0, 3)

Verwacht [1, 2, 8, 5, 4]

buren

Input swap([1, 2, 3], 1, 2)

Verwacht [1, 3, 2]

zelfde plek

Input swap([4, 5], 0, 0)

Verwacht [4, 5]

Wat nu nog mist

We hebben twee bouwstenen: kleinste-index vinden, en swappen. In de volgende stap maken we de eerste flexibeler — we willen kunnen zoeken vanaf een bepaalde positie in plaats van vanaf het begin.

Door naar bouwsteen 3: in een deel-lijst.