在列表中基于它的对添加两个或更多列表

时间:2013-01-03 01:40:29

标签: lisp common-lisp list-manipulation

我不太熟悉功能风格,我不想使用任何设置功能,所以我遇到了问题。无论是递归还是以不同的方式,我都在苦苦挣扎。

我在列表中有一组对,如下所示:

((4 2) (3 1) (3 2) (2 4) etc...)

在这对'(4 2)中,第二个元素'2'告诉我匹配哪个其他对,在这种情况下'(3 2)。 所以,我使用他们的第一个元素将这两对加在一起,在这种情况下,它是'4'和'3'。 新的一对现在是'(7 2)。依此类推列表中的其他对。 最后,它应该返回:

 ((7 2) (3 1) (2 4))

我不太关心订单。 。 我已经有一个可以添加两个不同对的工作函数。这个函数的唯一假设是对匹配。

因此,我想要做的是操纵这对配对列表以这些方式返回列表。

示例:

 take the list ((4 2) (3 1) (3 2) (2 4))    
 matching-pairs: '(4 2) and '(3 2)

 and then return --> ((7 2) (3 1) (2 4))


 take the list ((2 1) (3 2) (1 2) (5 1) (6 3))
 matching-pairs: '(2 1) and '(5 1)
                 '(3 2) and '(1 2)

 and then return --> ((7 1) (4 2) (6 3))

感谢您的时间和精力。

2 个答案:

答案 0 :(得分:3)

对您的列表进行迭代,并将每对car存储到assoc中的列表中,如下所示:

original: ((2 . 1) (3 . 2) (1 . 2) (5 . 1) (6 . 3))
new:      ((1 . (2 5))
           (2 . (3 1))
           (3 . (6))

然后将所有cdr加在一起并翻转每一对以获得此结果:

          ((7 . 1) (4 . 2) (6 . 3))

答案 1 :(得分:1)

(defun get-pairs (alist index)
  (cond
   (alist
    (if (= (nth 1 (car alist)) index)
       (append (list (caar alist)) (get-pairs (cdr alist) index))
       (get-pairs (cdr alist) index)))
  ((not alist)
   'nil)))


(defun get-iterator (alist)
  (labels
    ((f (alist res)
        (cond
          (alist
            (if (member (nth 1 (car alist)) res)
              (f (cdr alist) res)
              (f (cdr alist) (append (cdar alist) res))))
          ((not alist)
            res))))
    (f alist 'nil)))


(defun get-value (alist)
  (loop for i in (get-iterator alist)
        collect (get-pairs alist i)))

(defun list-sum (alist)
  (loop for i in (get-value alist)
        collect (apply #'+ i)))

(defun match-value (alist)
  (loop for i in (get-iterator alist)
        for j in (list-sum alist)
        collect (append (list j) (list i))))


(defparameter *my-list* '((2 1) (3 1) (4 2) (5 2) (8 1) (9 2) (1 3) (0 3)))

(print (match-value *my-list*))

对于凌乱的代码感到抱歉,但如果我理解问题就应该这样做。