2010-10-16 5 views

Répondre

16

Vous pouvez utiliser rotatef:

(rotatef (nth i lst) (nth j lst)) 

Bien sûr, l'indexation de la liste peut être coûteux (le coût O (taille de la liste)), donc si vous faites cela avec une certaine régularité, vous souhaitez plutôt d'utiliser un tableau:

(rotatef (aref arr i) (aref arr j)) 
4

Je voudrais éviter l'indexation dans la liste deux fois en utilisant nthcdr pour obtenir le cdr de la cellule de contre contenant le premier élément que vous souhaitez échanger et utiliser elt à g et l'élément restant de la sous-liste. Cela signifie que vous devez seulement indexer en commençant à partir de la tête de la liste une fois.

(let ((list-tail (nthcdr i list))) 
    (rotatef (car list-tail) 
      (elt list-tail (- j i))) 
    list) 

Au moins de mon point de vue, cela est suffisamment fastidieux pour justifier une fonction.

+6

DAMN! Le SO doit faire quelque chose au sujet de la coloration syntaxique. Je pensais que c'était mauvais pour python. – aaronasterling

Questions connexes