在Common Lisp列表中交换元素

15

有没有一个Common Lisp函数,可以根据给定的索引交换列表中的两个元素,并返回修改后的列表?

2个回答

21
你可以使用rotatef
(rotatef (nth i lst) (nth j lst))

当然,列表索引可能很昂贵(成本为O(列表大小)),因此如果您经常这样做,最好使用数组:

当然,对列表进行索引可能会很耗费资源(时间复杂度为O(列表的大小)),所以如果您需要频繁进行此操作,最好使用数组:

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

4

我建议使用nthcdr来获取包含你想要交换的第一个元素的cons单元格的cdr,然后使用elt从子列表中获取剩余的元素,而不是两次索引到列表。这意味着你只需要从列表头开始实际索引一次。

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

从我的角度来看,这足以证明需要一个函数来简化操作。


7
该死! SO 需要对语法高亮做些改进。我觉得它在 Python 上的表现很糟糕。 - aaronasterling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接