2010-11-05 63 views

Respuesta

2

Según Steele "set-difference devuelve una lista de elementos de list1 que no aparecen en list2. Esta operación no es destructiva".

Así que si la puesta a diferencia está vacío y las longitudes son los mismos ...

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

+1

por lo que diría que '(1 2 2) tiene los mismos elementos que' (1 1 2)? – 6502

+0

Depende de lo que quiere decir con "mismos elementos". Veo tu punto, sin embargo: si respondo 'sí', entonces la longitud no importa. Si respondo 'no', la diferencia establecida no resuelve el problema. – philosodad

6

Si el orden no es importante, puede usar iguales. Por ejemplo,

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

es verdadero. Por lo tanto, una forma de hacerlo sería (ordenar) la lista y luego usar igual. Tenga en cuenta que el género es destructivo, por lo que si el orden es importante, es posible que desee copiarlo primero.

+1

No importa si el orden es importante o no: SORT puede destruir (¡no ordenar in situ!) La lista original, por lo que se copia una buena idea en cualquier caso. –

+0

Si el orden era importante, la clasificación (y por lo tanto la copia) sería innecesaria; (igual X Y) sería suficiente. Creo que ese era el punto. – Kevin

2

Si los elementos que se repiten no son importantes, consulte también SET-EXCLUSIVE-OR.

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)))) 
+0

+1 para manejar duplicados. –

0

Ordenar ambas listas, a continuación, comparar:

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

No es realmente pertinente, pero tenga cuidado de que la ordenación destruya la lista original, por lo que este código se ve mal, ya que en la mayoría de los casos, o bien debe hacer una copia de antemano con, p. '(ordenar (copy-list l1) # '<)' o debe almacenar el resultado de la ordenación en l1 y l2. También este enfoque requiere elementos ordenables (la tabla hash no lo hace). – 6502

+0

Gracias por el aviso. Cuando escribí esto, me encontraba en tierra de función pura. –

2

Si el orden no es importante, puede usar "equal-set":

(igual conjuntos (1 2) (1 2)) -> T

(igual conjuntos (1 2) (2 1)) -> T

(igual conjuntos (1 2 5) (1 2)) -> NIL

(conjuntos iguales (1 2) (1 5 2)) -> NIL

+0

No puedo encontrar esta función en las especificaciones. ¿Puedes vincularlo? – tsikov

Cuestiones relacionadas