2012-03-30 14 views
2

Ich habe eine Liste von Objekten, die basierend auf einigen komplexen Kriterien vorsortiert sind, die nicht einfach mit attrgetter dupliziert werden können. Ich möchte eine Untermenge von ihnen weiter alphabetisch sortieren, wenn beide die Eigenschaft haben: part_of_subset.Delegiertensortierung basierend auf einer Bedingung

Wie mache ich das, ohne eine alphabetische Sortierfunktion neu zu definieren?

def cmp(a, b): 
    if a.part_of_subset and b.part_of_subset: 
     # sort alphabetically -- must I duplicate alphabetic sort code? 
    return 0 

Antwort

4

Während Sie können eine Vergleichsfunktion für die Sortierung definieren, wird im Allgemeinen empfohlen, eine Schlüsselfunktion zu verwenden. Für Ihre Anwendung sollte diese Schlüsselfunktion den gleichen Wert für alles zurückgeben, was unberührt bleiben soll, und den Sortierschlüssel für den Rest. Beispiel

def my_key(a): 
    if a.part_of_subset: 
     return 0, 
    return 1, a.sort_key 

collection.sort(key=my_key) 

Beachten Sie, dass die Teilmenge, die sortiert wird, zusammen nach den bereits sortierten Elementen zu einem Block zusammengefasst werden.

Edited: Um die Beschränkung loszuwerden, dass sort_key nie None sein kann, und die Code Arbeit in Python 3, ich die Schlüsselfunktion aktualisiert zu machen. Die alte Version könnte auch zu seltsamen Ergebnissen geführt haben, wenn die Sortierschlüssel verschiedene Typen haben (was nicht besonders nützlich erscheint, aber trotzdem).

+0

Noch sauberer. Sehr geschätzt. – ash

1

können Sie delegieren an eine andere Funktion unter bestimmten Bedingungen für die Sortierung von nur return cmp(a, b) sagen. Ich beziehe mich auf die eingebaute Python-Funktion cmp, nicht Ihre cmp.

Verwandte Themen