Ich habe eine Liste von Objekten in Python 3.5.1 mit mehreren benannten Attributen. Die Liste stellt eine Gruppe von C-Variablen dar, und daher hat jedes Objekt drei benannte Attribute, die drei gemeinsamen Basistypen entsprechen: uint8, uint16 und uint32.Python3 Objekte nach mehreren benannten Attributen sortieren
class variableList(object):
def __init__(self, eight, sixteen, thirtytwo):
self.size_8 = eight
self.size_16 = sixteen
self.size_32 = thirtytwo
Der Wert dieser benannte Attribute entweder (Nonetype) None
oder (str)'E'
. Pro Objekt hat nur eines der genannten Attribute einen Nicht-Nicht-Wert.
Ich möchte diese Liste von Objekten so sortieren, dass alle Objekte mit non-None-Wert für size_32 oben sind, gefolgt von size_16, gefolgt von size_8.
In Python 2.7.1 habe ich erfolgreich das, aber es fühlte sich wie schwarze Magie:
size_filtered_list = sorted(filtered_list, key=lambda y: (y.size_32, y.size_16, y.size_8))
aber in 3.5.1 dies nicht mehr funktioniert. Vorschläge?
Wenn Sie '__lt__' und' __eq__' Methoden definieren, können Sie Ihre Variablen ohne 'Schlüssel' Argument sortieren. Weil ich mit C nicht vertraut bin, könntest du im Grunde erklären, was '(str) 'E'' in Python bedeuten würde? –
Gibt es einen Grund, warum Sie effektiv boolesche Flags als 'None' und' 'E'' verwenden und nicht nur 'False' und' True' verwenden? Wenn Sie keine inkompatiblen Typen verwenden, könnte Ihre Sortierung zu einem Import am Anfang der Datei "from operator import attrgetter" mit der Sortierung vereinfachen: 'sorted (filtered_list, key = attrtretter ('size_32', 'size_16') , 'size_8')) ', was in allen Python-Versionen gut funktioniert, weil Sie vergleichbare Typen sortieren. – ShadowRanger
Oder wenn Sie eine weitere Variable wie in 'self.size_8_exist' hinzufügen, können Sie immer noch dieselbe Technik verwenden. – arewm