Ich habe eine Funktion, die eine Schlüsselfunktion für sorted() zurückgibt, für die das Ziel eine Liste von Dicts ist. Ein Arbeitsbeispiel ist:Sortiere eine Liste von Wörterbüchern nach einem gemeinsamen Schlüssel und verschiebe unbekannte Werte zum Ende
def sort2key(sortKey, **kwargs):
def attrgetter(obj):
try:
theItem = obj[sortKey]
except:
theItem = None
finally:
return theItem
return attrgetter
input = [
{'id':0, 'x': 2, 'y': 2},
{'id':1, 'x': 1, 'y': 0},
{'id':2, 'x': 0, 'y': 1}
]
theSort = {'sortKey': 'x'}
output = sorted(input, key=sort2key(**theSort))
print(input)
print(output)
>>> [{'x': 2, 'id': 0, 'y': 2}, {'x': 1, 'id': 1, 'y': 0}, {'x': 0, 'id': 2, 'y': 1}]
>>> [{'x': 0, 'id': 2, 'y': 1}, {'x': 1, 'id': 1, 'y': 0}, {'x': 2, 'id': 0, 'y': 2}]
Allerdings möchte ich die Funktion fehlende Werte zu handhaben zu können:
[
{'id':0, 'x': 2, 'y': 2},
{'id':1, 'x': 1, 'y': 0},
{'id':2, 'y': 1}
]
Aber der vorherigen Code den dict mit dem fehlenden x zu Beginn zwingen würde, - es muss abhängig von der Sortiereinstellung entweder Start oder Ende sein:
Darüber hinaus der Wert von x in diesem Fall sind Zahlen, aber sie könnten Strings oder andere Arten sein.
Gibt es eine Möglichkeit, unbekannte Werte zu Ende zu zwingen?
In Python 3.4 Sie auf die dict.get Bezug würde (a, b) Verfahren. Ihre Antwort bringt jedoch einen guten Punkt. Ich habe nicht unbedingt Nummern, also funktioniert 'inf' nicht. Der Wert könnte eine Zeichenfolge sein - ich werde die Frage aktualisieren. – timyha
Sie haben Recht. Wir haben die Wahl zwischen "get" und "setdefault", die frühere Methode liefert den Wert, aber ändert nicht das 'dict' als' setdefault'. Für die Einstellungen "ToEnd" und "ToStart" können Sie eine Min \ Max-Funktion hinzufügen, so dass das fehlende Element immer direkt zur Start-/Endposition gehört. Ich werde die Antwort bearbeiten. –
Danke nino, mit min()/max() für verschiedene Typen ist eine gute Idee. – timyha