2016-03-30 11 views
2
Segment = namedtuple('Segment', 'start end') 
segments = [Segment(start=9, end=1), Segment(start=1, end=3), Segment(start=2, end=5), Segment(start=3, end=6)] 

Ich habe versucht, den folgenden Code, um die Liste zu sortieren:Wie sortiere ich eine Liste mit Namenstupeln basierend auf dem Unterschied zwischen Attributen?

sorted(segments, key = lambda s: s.end - s.start) 

Aber das funktioniert nicht. Wie kann ich das machen?

Erwartete Ausgabe:

[Segment(start=3, end=6), Segment(start=2, end=5), Segment(start=1, end=3), Segment(start=9, end=1)] 
+0

Was ist das erwartete Ergebnis? – styvane

+0

Segmente = [Segment (Start = 3, Ende = 6), Segment (Start = 2, Ende = 5), Segment (Start = 1, Ende = 3), Segment (Start = 9, Ende = 1)] – dhaliman

Antwort

2

Sie müssen angeben, dass Sie die „Sequenz“ wollen, wo end < start oder end - start < 0 erste, auch für den Fall gibt viele segments sind, die die Kriterien entsprechen, sollten Priorität „-Folge zu geben "mit höchster end Wert.

>>> from collections import namedtuple 
>>> Segment = namedtuple('Segment', 'start end') 
>>> segments = [Segment(start=9, end=1), Segment(start=1, end=3), Segment(start=2, end=5), Segment(start=3, end=6)] 
>>> sorted(segments, key=lambda s: (s.end < s.start, -s.end)) 
[Segment(start=3, end=6), Segment(start=2, end=5), Segment(start=1, end=3), Segment(start=9, end=1)] 
Verwandte Themen