【问题标题】:List position mapping in common lispcommon lisp中的列表位置映射
【发布时间】:2016-12-28 20:26:41
【问题描述】:

我有 3 个列表,其中前 2 个列表的大小相同,第三个是第一个的子列表。 假设 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 的位置。 但我不确定如何继续我的功能..

【问题讨论】:

    标签: common-lisp


    【解决方案1】:

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

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

    【讨论】:

    • 理论上,您可以遍历第三个列表,构建一个 hast 表,然后遍历第一个列表,生成“位置键控”哈希表,最后遍历第二个列表以收集正确的价值观。但您最好并行地遍历第二个和第三个。
    猜你喜欢
    • 2011-03-31
    • 2014-04-26
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多