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))