2017-03-17 8 views
4

Ich habe eine Liste von Elementen, die ich sortieren möchte, aber ich möchte nicht alle von ihnen sortieren, nur diejenigen mit einem bestimmten Zustand. Zum Beispiel, sagen wir, ich habe eine Liste von peole:Python: spezifische Elemente in einer Liste sortieren

lst = [Mary, John, Anna, Peter, Laura, Lisa, Steve] 

Einige von ihnen einen Job haben, lassen Sie uns [Anna, Lisa, Steve] sagen. Ich möchte diese nach der Anzahl der Arbeitsstunden sortieren und an den Anfang der Liste verschieben, während der Rest genau in der gleichen Reihenfolge bleibt. Sagen wir also die Anzahl der Stunden, die sie arbeiten, ist die folgende:

Anna.job.hours # 10 
Lisa.job.hours # 5 
Steve.job.hours # 8 

Nach der teilweisen sortieren die Liste würde wie folgt aussehen:

[Lisa, Steve, Anna, Mary, John, Peter, Laura] 

Natürlich habe ich zwei neue Listen aus dem Original erstellen konnte ein, sortieren die, die ich sortieren möchten und setzen sie wieder zusammen zu erreichen, was ich bin nach:

with_job = [person for person in lst if person.job] 
without_job = [person for person in lst if not person.job] 

with_job.sort(key=lambda p: p.job.hours) 

lst = with_job + without_job 

Aber ich frage mich, ob es eine straigthforward ist, Pythonic Art und Weise, dies zu tun.

+1

Ich finde deinen Weg Pythonic genug zu tun. Sie brauchen nicht die zweite Liste, aber anders als das .. –

Antwort

6

Warum nicht:

lst.sort(key=lambda p: p.job.hours if p.job else 999) 
+0

einfach und effizient. gut gemacht. –

+0

Behält diese Lösung die Bestellung für Leute ohne Job bei? – Elmex80s

+0

Warte, jetzt, wo ich darüber nachdenke, würde diese Lösung die Menschen ohne Arbeit nicht am Anfang der Liste positionieren und nicht am Ende, wie es beabsichtigt ist? – dabadaba

Verwandte Themen