我有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的位置。 但我不确定如何继续我的功能..
答案 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)))