2016-03-30 2 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)] 

Я попытался следующий код для сортировки списка:Как отсортировать список, содержащий namedtuples, на основе различия между атрибутами?

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

Но это не работает. Как я могу это сделать?

Ожидаемый результат:

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

Каков ожидаемый результат? – styvane

+0

сегменты = [Сегмент (начало = 3, конец = 6), Сегмент (начало = 2, конец = 5), Сегмент (начало = 1, конец = 3), Сегмент (начало = 9, конец = 1)] – dhaliman

ответ

2

Вы должны указать, что вы хотите «последовательность», где end < start или end - start < 0 первым, а также в случае, если есть много segments соответствующих этим критериям, приоритет следует отдавать «последовательность "с наивысшим значением end.

>>> 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)] 
Смежные вопросы