Wie finde ich die Duplikate in einer Liste mit ganzen Zahlen und erstelle eine weitere Liste mit den Duplikaten?
Antworten
Zu viele Anzeigen?Bei der Verwendung von toolz :
from toolz import frequencies, valfilter
a = [1,2,2,3,4,5,4]
>>> list(valfilter(lambda count: count > 1, frequencies(a)).keys())
[2,4]
Es gibt viele Antworten hier oben, aber ich denke, dies ist ein relativ gut lesbarer und leicht verständlicher Ansatz:
def get_duplicates(sorted_list):
duplicates = []
last = sorted_list[0]
for x in sorted_list[1:]:
if x == last:
duplicates.append(x)
last = x
return set(duplicates)
Anmerkungen:
- Wenn Sie die Anzahl der Vervielfältigungen beibehalten wollen, sollten Sie die Besetzung loswerden zu 'set' am Ende, um die vollständige Liste zu erhalten
- Wenn Sie lieber Generatoren verwenden möchten, ersetzen Sie duplicates.append(x) con Ertrag x und die Rückgabeanweisung am Ende (Sie können später auf set umstellen)
Hier ist ein schneller Generator, der ein dict verwendet, um jedes Element als Schlüssel mit einem booleschen Wert zu speichern, um zu prüfen, ob das doppelte Element bereits ausgegeben wurde.
Für Listen mit allen Elementen, die Hash-Typen sind:
def gen_dupes(array):
unique = {}
for value in array:
if value in unique and unique[value]:
unique[value] = False
yield value
else:
unique[value] = True
array = [1, 2, 2, 3, 4, 1, 5, 2, 6, 6]
print(list(gen_dupes(array)))
# => [2, 1, 6]
Für Listen, die Listen enthalten können:
def gen_dupes(array):
unique = {}
for value in array:
is_list = False
if type(value) is list:
value = tuple(value)
is_list = True
if value in unique and unique[value]:
unique[value] = False
if is_list:
value = list(value)
yield value
else:
unique[value] = True
array = [1, 2, 2, [1, 2], 3, 4, [1, 2], 5, 2, 6, 6]
print(list(gen_dupes(array)))
# => [2, [1, 2], 6]
Ich sehe keine Lösung, die nur Iteratoren verwendet, also hier gehen wir
Dies setzt voraus, dass die Liste sortiert ist, was hier der Nachteil sein kann.
a = [1,2,3,2,1,5,6,5,5,5]
a.sort()
set(map(lambda x: x[0], filter(lambda x: x[0] == x[1], zip(a, a[1:]))))
{1, 2, 5}
Mit diesem Code können Sie leicht überprüfen, wie schnell dies auf Ihrem Rechner mit einer Million potenzieller Duplikate ist:
Erzeugen Sie zunächst die Daten
import random
from itertools import chain
a = list(chain(*[[n] * random.randint(1, 2) for n in range(1000000)]))
Und führen Sie den Test durch:
set(map(lambda x: x[0], filter(lambda x: x[0] == x[1], zip(a, a[1:]))))
Diese Lösung eignet sich natürlich nur, wenn Ihre Liste bereits sortiert ist.
2 Stimmen
Mögliche Duplikate von Wie entfernt man Duplikate aus einer Liste in Python unter Beibehaltung der Reihenfolge?
3 Stimmen
Wollen Sie die Duplikate einmalig oder jedes Mal, wenn sie wieder gesehen werden?
0 Stimmen
Ich denke, diese Frage wurde hier bereits sehr viel effizienter beantwortet. stackoverflow.com/a/642919/1748045 Schnittpunkt ist eine eingebaute Methode von set und sollte genau das tun, was erforderlich ist