是否有一个共同的LISP函数来比较两个列表的内容?

时间:2010-11-05 22:48:26

标签: lisp common-lisp

特别是,我只想确保两个列表具有相同的元素,忽略顺序

7 个答案:

答案 0 :(得分:7)

如果订单不重要,您可以使用相同的。例如,

(equal (list 1 2) (list 1 2))

是真的。因此,一种方法是(排序)列表,然后使用相等的。请注意,排序具有破坏性,因此如果订单很重要,您可能需要先复制它。

答案 1 :(得分:4)

(defun same-bag-p (bag1 bag2 &key (test #'eql))
  (let ((table (make-hash-table :test test)))
    (loop for key in bag1 do (incf (gethash key table 0)))
    (loop for key in bag2 do (decf (gethash key table 0)))
    (loop for val being each hash-value of table always (= val 0))))

答案 2 :(得分:2)

如果重复项目不重要,请参阅SET-EXCLUSIVE-OR。

答案 3 :(得分:1)

根据Steele“set-difference返回list1中未出现在list2中的元素列表。此操作不具有破坏性。”

因此,如果设置差异为空且长度相同...

http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node152.html#SECTION001950000000000000000

答案 4 :(得分:1)

如果订单不重要,您可以使用“等于”:

(等等(1 2)(1 2)) - > Ť

(等等(1 2)(2 1)) - > Ť

(等等(1 2 5)(1 2)) - > NIL

(等等(1 2)(1 5 2)) - > NIL

答案 5 :(得分:0)

对两个列表进行排序,然后进行比较:

(equal (sort l1 #'<) (sort l2 #'<))

答案 6 :(得分:0)

(defun list= (l1 l2 &key (test #'eql))
  (loop for i in l1
     for j in l2
     always (funcall test i j)))


(list= '(1 2 "a") '(1 2 "a") :test #'equal) ;; => T
(list= '(1 2 "a") '(1 2 "a") :test #'eql) ;; => NIL