P: como obtenho apenas os elementos duplicados em uma lista?
delete-dups
(e cl-delete-duplicates
) exclui todos os elementos duplicados de uma lista:
(delete-dups '(a b c c d d)) ; => '(a b c d)
Eu quero o inverso: existe uma função que retorna apenas as duplicatas em uma lista?
(mystery-function '(a b c c d d)) ; => '(c d)
Usando traço:
Um conjunto de testes rápidos:
Atualmente, parece retornar os itens na ordem da primeira ocorrência de cada duplicata, mas não vejo nada
-group-by
que garanta isso; portanto, acho que não podemos confiar nisso. Poderia ser mais eficiente, usando hashtables, mas isso funciona.fonte
Aqui está uma versão sem hash:
fonte
Reversão
delete-dups
usando ...delete-dups
(eseq
):fonte
Isso é semelhante à definição de @ caseneuve.
Mas ambos sofrem ao testar cada elemento da lista, mesmo que já tenha sido testado. E então eles correm
delete-dups
.Essa definição é direta e não sofre dessas ineficiências:
Também parece ser cerca de 6 vezes mais rápido que a solução de tabela de hash (
get-duplicates
, acima).fonte