如何使用子列表对列表进行排序(常见Lisp)

时间:2011-05-14 17:40:57

标签: sorting lisp common-lisp

如何使用子列表对列表进行排序?

(setq list '((0) (1) (2) (0 1 5) (0 1 3) (0 1 5) (0 3 0) (0) (1) 
             (2 7 19) (0 0 3 0)))

; restricting the sort to only the first element:

(sort (copy-seq list) #'< :key #'car)

--> ((0) (0 1 5) (0 1 3) (0 1 5) (0 3 0) (0) (0 0 3 0) (1) (1) (2) (2 7 19))

我正在寻找的输出是对子列表的所有元素进行排序:

--> ((0) (0) (0 0 3 0) (0 1 3) (0 1 5) (0 1 5) (0 3 0) (1) (1) (2) (2 7 19))

2 个答案:

答案 0 :(得分:12)

首先定义一个确定一个列表是否小于另一个列表的函数。以下示例假定列表只能包含数字:

(defun list< (a b)
  (cond ((null a) (not (null b)))
        ((null b) nil)
        ((= (first a) (first b)) (list< (rest a) (rest b)))
        (t (< (first a) (first b))) ))

使用此功能,您现在可以对列表列表进行排序。

(sort (copy-seq list) #'list<)

答案 1 :(得分:0)

要对子列表的所有元素进行排序,请使用自定义函数进行排序谓词更改排序谓词到可以确定两个子列表顺序的自定义函数。或者,将排序键更改为自定义函数,将子列表减少为可排序值。