20 Stimmen

Beibehaltung der Ordnung bei Verwendung der Python-Mengenunterschiede

Ich führe eine Set-Differenz-Operation in Python durch:

x = [1, 5, 3, 4]
y = [3]

result = list(set(x) - set(y))
print(result)

Ich bekomme:

[1, 4, 5]

Wie Sie sehen können, hat sich die Reihenfolge der Listenelemente geändert. Wie kann ich die Liste beibehalten? x im Originalformat?

25voto

Raymond Hettinger Punkte 197261

Es sieht so aus, als bräuchten Sie ein bestelltes Set anstelle eines normalen Sets.

>>> x = [1, 5, 3, 4]
>>> y = [3]
>>> print(list(OrderedSet(x) - OrderedSet(y)))
[1, 5, 4]

Python wird nicht mit einem geordneten Satz geliefert, aber es ist leicht, einen zu erstellen:

import collections

class OrderedSet(collections.Set):
    def __init__(self, iterable=()):
        self.d = collections.OrderedDict.fromkeys(iterable)

    def __len__(self):
        return len(self.d)

    def __contains__(self, element):
        return element in self.d

    def __iter__(self):
        return iter(self.d)

Ich hoffe, das hilft :-)

20voto

kindall Punkte 167554

Die Gruppen sind nicht geordnet, so dass Sie die Ergebnisse nach der Differenzierung der Gruppen wieder in die richtige Reihenfolge bringen müssen. Glücklicherweise haben Sie die Elemente bereits in der gewünschten Reihenfolge, so dass dies einfach ist.

diff = set(x) - set(y)
result = [o for o in x if o in diff]

Dies kann jedoch vereinfacht werden; Sie können die Differenzierung als Teil des Listenverständnisses vornehmen (obwohl es wohl etwas weniger klar ist, dass Sie das tun).

sety = set(y)
result = [o for o in x if o not in sety]

Sie können dies sogar tun, ohne die set von y aber die set bietet schnelle Mitgliedschaftstests, die Ihnen viel Zeit sparen, wenn eine der beiden Listen groß ist.

11voto

jamylak Punkte 119693

Sie könnten einfach Folgendes tun

diff = set(x) - set(y)
[item for item in x if item in diff]

oder

filter(diff.__contains__, x)

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