709 Stimmen

Wie finde ich die Duplikate in einer Liste und erstelle eine weitere Liste mit ihnen?

Wie finde ich die Duplikate in einer Liste mit ganzen Zahlen und erstelle eine weitere Liste mit den Duplikaten?

2 Stimmen

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

1voto

Andreas Profous Punkte 1200

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]

1voto

tvt173 Punkte 1558

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)

1voto

John B Punkte 3446

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]

0voto

rassa45 Punkte 3400

Einzeilige Lösung:

set([i for i in list if sum([1 for a in list if a == i]) > 1])

0voto

firelynx Punkte 28306

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X