在常见的lisp

时间:2016-12-28 20:26:42

标签: common-lisp

我有3个列表,其中前2个列表具有相同的大小,第3个列表是第一个列表。 让我们说list1是'(X Y Z W),list2是'(1 2 3 4)而list3是'(X Z) 我需要得到第二个子列表的子列表,而list1中list3中没有位置,所以在这种情况下结果应该是(1 3)。

要获得元素上的位置,我可以这样写:

    (position 'Z
      '(X Y Z W)
      :test #'equal)

这将返回元素的基于0的位置。 但我不确定如何继续我的功能..

1 个答案:

答案 0 :(得分:2)

这里有两种可能的解决方案,第一种是使用原始函数的二次解决方案:

(defun position-map (l1 l2 l3)
  (let ((pairs (pairlis l1 l2)))
    (mapcar (lambda (x) (cdr (assoc x pairs))) l3)))

(position-map '(x y z w) '(1 2 3 4) '(x z)) ;; => (1 3)

首先,我们创建一个列表,其中包含两个列表的元素形成的对,然后我们扫描第三个列表,只获取汽车对等于第三个列表元素的对的元素。如果第一个列表中的元素都不同,则此方法仅

第二个解决方案,线性,使用迭代,并允许第一个列表中的重复元素,(但如果第三个列表的元素被排序为第一个列表的元素,它只能 ):

(defun position-map (l1 l2 l3)
  (loop 
     for x in l1
     for y in l2
     when (eql x (car l3)) 
     collect y
     and do (pop l3)))