特别是,我只想确保两个列表具有相同的元素,忽略顺序
答案 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