Update : Diese Antwort ist ab Python 3.7 veraltet. Siehe jrc's Antwort oben für eine bessere Lösung. Ich werde diese Antwort hier nur aus historischen Gründen aufbewahren.
Eine geordnete Menge ist funktionell ein Spezialfall eines geordneten Wörterbuchs.
Die Schlüssel eines Wörterbuchs sind eindeutig. Wenn man also die Werte in einem geordneten Wörterbuch außer Acht lässt (z. B. durch Zuweisung von None
), dann hat man im Wesentlichen eine geordnete Menge.
Ab Python 3.1 y 2.7 Es gibt collections.OrderedDict
. Es folgt ein Beispiel für die Implementierung eines OrderedSet. (Beachten Sie, dass nur wenige Methoden definiert oder überschrieben werden müssen: collections.OrderedDict
y collections.MutableSet
die Schwerstarbeit leisten).
import collections
class OrderedSet(collections.OrderedDict, collections.MutableSet):
def update(self, *args, **kwargs):
if kwargs:
raise TypeError("update() takes no keyword arguments")
for s in args:
for e in s:
self.add(e)
def add(self, elem):
self[elem] = None
def discard(self, elem):
self.pop(elem, None)
def __le__(self, other):
return all(e in other for e in self)
def __lt__(self, other):
return self <= other and self != other
def __ge__(self, other):
return all(e in self for e in other)
def __gt__(self, other):
return self >= other and self != other
def __repr__(self):
return 'OrderedSet([%s])' % (', '.join(map(repr, self.keys())))
def __str__(self):
return '{%s}' % (', '.join(map(repr, self.keys())))
difference = property(lambda self: self.__sub__)
difference_update = property(lambda self: self.__isub__)
intersection = property(lambda self: self.__and__)
intersection_update = property(lambda self: self.__iand__)
issubset = property(lambda self: self.__le__)
issuperset = property(lambda self: self.__ge__)
symmetric_difference = property(lambda self: self.__xor__)
symmetric_difference_update = property(lambda self: self.__ixor__)
union = property(lambda self: self.__or__)
26 Stimmen
Was ist mit dem Converse, einer Tasche voller Dinge? (ungeordnet und nicht einmalig)
28 Stimmen
@wim
collections.Counter
ist die Tasche von Python.4 Stimmen
Was passiert, wenn etwas zweimal hinzugefügt wird? Wie sollte die Position lauten?
7 Stimmen
@McKay - wenn es dem Verhalten von collections.OrderDict folgen würde, wäre es immer noch an der Stelle des ursprünglichen Zusatzes
13 Stimmen
Achtung: einige Antworten sind veraltet. Z.B.,
dict
ist jetzt nach Einfügung geordnet (garantiert seit Python 3.7)0 Stimmen
^^+1 Siehe Antwort unten: stackoverflow.com/a/53657523/3559330 . Dicts erhalten die Reihenfolge in Python 3.7+. Ansonsten verwenden Sie OrderedDict.
1 Stimmen
From sortedcontainers import Sorted*
0 Stimmen
pypi.org/project/ordered-set
0 Stimmen
Wenn Sie speziell eine geordnete Menge benötigen, um eine Liste zu deduplizieren, lesen Sie bitte stackoverflow.com/questions/480214 .