En particular, solo quiero asegurarme de que dos listas tengan los mismos elementos, ignorando el orden¿Existe una función LISP común para comparar el contenido de dos listas?
Respuesta
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
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.
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. –
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
Si los elementos que se repiten no son importantes, consulte también SET-EXCLUSIVE-OR.
(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))))
+1 para manejar duplicados. –
Ordenar ambas listas, a continuación, comparar:
(equal (sort l1 #'<) (sort l2 #'<))
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
Gracias por el aviso. Cuando escribí esto, me encontraba en tierra de función pura. –
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
No puedo encontrar esta función en las especificaciones. ¿Puedes vincularlo? – tsikov
- 1. Java comparar dos listas
- 2. Método común para comparar dos objetos Java
- 3. Comparar dos listas para las diferencias
- 4. Comparar dos listas para buscar elementos comunes
- 5. ¿Existe una convención de nomenclatura de paquetes de lisp común?
- 6. C#: comparar el contenido de dos IEnumerables
- 7. ¿Cómo comparar el contenido de dos matrices?
- 8. Comparar dos listas genéricas y eliminar duplicados
- 9. Intercambiando elementos en una lista Lisp común
- 10. Cadena para listar sin # \ en lisp común
- 11. comparar dos impulso :: función
- 12. ¿Cuáles son las mejores formas de comparar el contenido de dos objetos similares a listas?
- 13. ¿Cómo puedo comparar dos listas en Groovy
- 14. ¿Existe una forma estándar de comparar dos rangos en C++?
- 15. asignación de una función sobre dos listas en elisp
- 16. Temporizador de Lisp común
- 17. ¿Existe un nombre típico para una función como 'mapa' que opera en una lista de listas de argumentos en lugar de múltiples listas de argumentos?
- 18. Lenguaje de lisp común: ¿hay una manera mejor?
- 19. comparar dos listas de actualizaciones, supresiones y adiciones
- 20. Comparando listas en Lisp
- 21. Lisp común: ¿Cómo comprobar la igualdad establecida, ignorando el orden?
- 22. Lisp común - ¿Desempaquetar lista? (Similar a Python)
- 23. ¿Función o modismo de Lisp común para crear un nombre de archivo temporal?
- 24. ant: cómo comparar el contenido de dos archivos
- 25. Comparar el contenido de dos archivos en Dreamweaver
- 26. Función Delphi que compara el contenido de dos TStream?
- 27. python iterar sobre las dos listas al comparar elementos
- 28. comparar contenido de ByteBuffer?
- 29. Lisp común: crear un directorio
- 30. Manera pitónica de comparar dos listas e imprimir las diferencias
por lo que diría que '(1 2 2) tiene los mismos elementos que' (1 1 2)? – 6502
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