2015-01-06 3 views
1

Я пытаюсь сортировать список по нескольким условиям, используя этот код.Python - Сортировочные списки

lis = sorted([lsDataSorted[i:i+8] for i in range(0,len(lsDataSorted),8)],key=lambda x:(x[7],int(x[5])-int(x[6]),x[5],x[0]),reverse=True) 

Теперь нам не нужно беспокоиться говорить о том, что каждый объект, но мы видим, что у меня есть функция «реверс» сортировки. Теперь последнее условие x[0] - список имен. Используя reverse=True, мы знаем, что сортировка будет в обратном порядке (z-a). Мой вопрос: могу ли я «вернуться назад» к нормальному состоянию только для последнего условия? Если да, то как?

+0

[Этот ответ] (http://stackoverflow.com/a/6667177/1126943) должен вам помочь. – zch

+0

См. [Этот вопрос] (http://stackoverflow.com/questions/1516249/python-list-sorting-with-multiple-attributes-and-mixed-order) и его ответы. – ErikR

+0

хорошо, так что в других словах его лучше написать новую строку с той же самой лямбдой, но с последним условием? – diaco

ответ

4

Я бы рекомендовал обернуть каждый кусок lsDataSorted в пользовательский класс, который обеспечит сравнение по вашему сложному состоянию. Например:

import functools 

@functools.total_ordering 
class Compare(object): 
    def __init__(self, chunk): 
     self.x = chunk[7], int(chunk[5]) - int(chunk[6]), chunk[5] 
     self.y = chunk[0] 
    def __eq__(self, other): 
     return (self.x==other.x) and (self.y==other.y) 
    def __lt__(self, other): 
     if self.x != other.x: 
      return self.x < other.x 
     return self.y > other.y 

Теперь

lis = sorted([lsDataSorted[i:i+8] 
       for i in range(0,len(lsDataSorted),8)], 
       key=Compare, reverse=True) 

должно дать вам смешанный комплекс сортировки вы, видимо, искал.