F: Wie erhalte ich nur die doppelten Elemente in einer Liste?
delete-dups
(und cl-delete-duplicates
) löscht alle doppelten Elemente aus einer Liste:
(delete-dups '(a b c c d d)) ; => '(a b c d)
Ich möchte das Gegenteil: Gibt es eine Funktion, die nur die Duplikate in einer Liste zurückgibt ?
(mystery-function '(a b c c d d)) ; => '(c d)
Verwenden des Bindestrichs:
Eine schnelle Testsuite:
Es scheint derzeit, dass die Elemente in der Reihenfolge des ersten Auftretens jedes Duplikats zurückgegeben werden, aber ich sehe nichts
-group-by
, was dies garantiert, daher denke ich nicht, dass man sich darauf verlassen kann. Es könnte möglicherweise effizienter sein, Hashtabellen zu verwenden, aber das funktioniert.quelle
Hier ist eine Nicht-Hash-Version:
quelle
Umkehren
delete-dups
mit ...delete-dups
(undseq
):quelle
Dies ähnelt der Definition von @ caseneuve.
Beide leiden jedoch unter dem Testen jedes Elements in der Liste, selbst wenn es bereits getestet wurde. Und dann rennen sie
delete-dups
.Diese Definition ist unkompliziert und leidet nicht unter diesen Ineffizienzen:
Es scheint auch ungefähr 6-mal schneller zu sein als die Hash-Table-Lösung (
get-duplicates
oben).quelle