2017-12-27 37 views
2

Ich habe eine Liste von Flügen, die am Abflugdatum zuerst sortiert werden und dann nach der Gesamtflugdauer sortiert werden müssen, wobei ihre Reihenfolge nach dem Datum gehalten wird.Sortierliste nach mehreren Methoden

  • Das Abflugdatum aufrufen ist eine Methode des Objekts "Flight".
  • Das Aufrufen der Flugdauer ist ebenfalls eine Methode des Objekts "Flight".

Ausgabe sollte:

  • 04-07-2017 Flugzeit: 05:00
  • 04-07-2017 Flugzeit: 06:00
  • 2017.05.07 Flugzeit: 04 00
  • 05-07-2017 Flugzeit: 05:00

ich habe versucht:

sorted(flights, key=methodcaller('date','flighttime')) 

aber Methode Anrufer nimmt nur 1 Argument. Ich habe auch zuerst groupby versucht und dann nach Flugzeit sortiert, aber dann wird die Liste nur nach Flugzeit sortiert.

danke

Antwort

2

methodcaller kann nicht mehr als 1-Methode aufrufen, die anderen Argumente sind Parameter:

f = methodcaller ('name', 'foo', bar = 1), wird der Anruf f (b) gibt b.name ('foo', bar = 1)

So kann es mit methodcaller getan werden, aber in einer komplexeren Art und Weise wahrscheinlich beteiligt lambda wie (ungetestet) lambda x : methodcaller('name')(x),methodcaller('flighttime')(x)

So würde ich ein einfaches lambda stattdessen verwenden (wo x ein Flight Objekt ist):

sorted(flights, key=lambda x : (x.date(),x.flighttime())) 
+0

Dank! Und wenn ich die Datumsreihenfolge beibehalten möchte, aber die Flugzeit-Reihenfolge umkehren? Also nur auf den zweiten Schlüssel umkehren? – Ward

+0

Wenn die Flugzeit numerisch ist, können Sie den zweiten Schlüssel einfach umkehren: 'sortiert (flights, key = lambda x: (x.date(), - x.flighttime())' –

+0

Nein, es ist ein Timedelta, aber es hat funktioniert indem du die - in Front stellst! Danke – Ward