如何在 Common Lisp 中按特定顺序对列表进行排序?
How to sort a list by a certain order in Common Lisp?
所以我知道如何对 (1 2 3)
这样的列表进行排序
例如在 Common Lisp 中按升序排列。
但是我需要对这个列表进行排序:( (1 2 3) nil 1)
按照 3rd 元素的降序排列。
有办法吗?
sort
函数接受一个谓词,该谓词将用于判断一个元素何时在另一个元素之前(参见 hyperspec)。
所以,定义一个函数compare-3rd
:
(defun compare-3rd (a b)
(< (nth 2 a) (nth 2 b)))
并将其用作谓词:
(sort '(( (1 2 3) nil 4)
( (1 2 3) nil 2)
( (1 2 3) nil 3))
'compare-3rd)
==> (((1 2 3) NIL 2) ((1 2 3) NIL 3) ((1 2 3) NIL 4))
当然,如果你想要降序,你可以使用 >
而不是 compare-3rd
中的 <
。
所以我知道如何对 (1 2 3)
这样的列表进行排序
例如在 Common Lisp 中按升序排列。
但是我需要对这个列表进行排序:( (1 2 3) nil 1)
按照 3rd 元素的降序排列。
有办法吗?
sort
函数接受一个谓词,该谓词将用于判断一个元素何时在另一个元素之前(参见 hyperspec)。
所以,定义一个函数compare-3rd
:
(defun compare-3rd (a b)
(< (nth 2 a) (nth 2 b)))
并将其用作谓词:
(sort '(( (1 2 3) nil 4)
( (1 2 3) nil 2)
( (1 2 3) nil 3))
'compare-3rd)
==> (((1 2 3) NIL 2) ((1 2 3) NIL 3) ((1 2 3) NIL 4))
当然,如果你想要降序,你可以使用 >
而不是 compare-3rd
中的 <
。