P: ¿cómo obtengo solo los elementos duplicados en una lista?
delete-dups
(y cl-delete-duplicates
) elimina todos los elementos duplicados de una lista:
(delete-dups '(a b c c d d)) ; => '(a b c d)
Quiero lo contrario: ¿hay una función que devuelva solo los duplicados en una lista?
(mystery-function '(a b c c d d)) ; => '(c d)
Usando guión:
Un conjunto de pruebas rápidas:
Actualmente parece devolver los elementos en el orden de la primera aparición de cada duplicado, pero no veo nada en
-group-by
eso que lo garantice, así que no creo que se pueda confiar en eso. Posiblemente podría ser más eficiente, usando tablas hash, pero esto funciona.fuente
Aquí hay una versión sin hash:
fuente
Invertir
delete-dups
usando ...delete-dups
(yseq
):fuente
Esto es similar a la definición de @ caseneuve.
Pero ambos sufren de probar cada elemento de la lista, incluso si ya ha sido probado. Y luego corren
delete-dups
.Esta definición es sencilla y no sufre de esas ineficiencias:
También parece ser aproximadamente 6 veces más rápido que la solución de tabla hash (
get-duplicates
arriba).fuente