Sorting 根据common lisp中的另一个列表对列表进行排序

Sorting 根据common lisp中的另一个列表对列表进行排序,sorting,lisp,common-lisp,Sorting,Lisp,Common Lisp,您将如何根据另一个列表中定义的顺序对列表进行排序 list = ( (:value "A" :index 0) (:value "B" :index 1) (:value "C" :index 2) ) sorter = (1 2 0) 导致: list* = ( (:value "B" :index 1) (:value "C" :index 2) (:value "A" :index 0) ) 谢谢这好像是个家庭作业。我会给你一些指示,告诉你我第一眼会怎么做。这并不意味着它是最好的解决方

您将如何根据另一个列表中定义的顺序对列表进行排序

list = ( (:value "A" :index 0) (:value "B" :index 1) (:value "C" :index 2) )
sorter = (1 2 0)
导致:

list* = ( (:value "B" :index 1) (:value "C" :index 2) (:value "A" :index 0) )

谢谢

这好像是个家庭作业。我会给你一些指示,告诉你我第一眼会怎么做。这并不意味着它是最好的解决方案,但肯定可以为您指出一种解决方法

获取
sorter
列表,并构建一个哈希表,该哈希表针对列表中的每个数字存储其在列表中的位置(例如,它将使用显示的列表保存
((1->0)(2->1)(0->3))
。)

接下来,使用CL库中适当的任何排序函数,相应地指定
:key
和比较函数。也就是说,键函数应该访问每个元素中的索引字段,比较函数应该比较散列中每个索引字段元素的值。

您可以这样做:

(defun my-sort (lst idx)
  (labels 
      ((getall (i) (remove-if-not (lambda (e) (=  i (getf e :index))) lst)))
    (loop for i in idx append (getall i))))
然后


或者:
(defun my_sort(lst idx)(sort lst#’)(lambda(ab)(<(position(getf a:index)idx)(position(getf b:index)idx)))
,或者更灵活一点的
(defun my_sort(lst idx&可选)(srt#“这一个在复杂性方面不是特别好。我不明白为什么这应该被视为离题。许多通常被认为是合法的问题不包括试图解决的问题。在这种情况下,这个问题和期望的行为至少与许多其他被认为合法的问题一样精确.但是,由于缺乏努力,否决票是合适的。正如迭戈·塞维利亚所说,这听起来也像是家庭作业。
(my-sort '((:value "A" :index 0) (:value "B" :index 1) (:value "C" :index 2)) '(1 2 0))
=> ((:VALUE "B" :INDEX 1) (:VALUE "C" :INDEX 2) (:VALUE "A" :INDEX 0))