Как отсортировать буквенно-цифровой список объектов модели Django - PullRequest
2 голосов
/ 14 марта 2011

Я пытаюсь перенести ответ на вопрос, поставленный в Как отсортировать буквенно-цифровой набор в python для Django. У меня есть список экземпляров модели Django, возвращаемых запросом, и я не могу понять, как использовать лямбду для построения элегантной (или иначе!) Функции сортировки.

Если моя модель содержит атрибут «имя» - например,

result = Take.objects.all()
for i in result:
   print i.name

Как мне отсортировать итоговый список объектов по атрибуту имени и применить ряд тестов?

т.е. мое имя может быть равно «1A», «1», «A1», «001A» и т. д.

например. дать этот порядок (на основе имени)

1A
2A
10A
A1
A2
A10
A11
B2
B4

Ответы [ 2 ]

5 голосов
/ 14 марта 2011

Используйте operator.attrgetter для сортировки ваших объектов по значению атрибута:

import operator

class Foo:
    def __init__(self, name):
        self.name = name

l = [Foo('AA'), Foo('a'), Foo('AB')]
l.sort(key=operator.attrgetter('name'))
print [o.name for o in l]
['AA', 'AB', 'a']

Вот еще один ответ, который я предоставил , который определяет функцию для выполнения буквенно-цифровой сортировки в «человеческом» порядке. Объединяя функцию _human_key в приведенном выше примере, вы можете сделать:

l.sort(key=lambda x: _human_key(x.name))
print [o.name for o in l]
['a', 'AA', 'AB']
0 голосов
/ 14 марта 2011

Попробуйте это:

result = Take.objects.order_by('name')
for x in result:
    print x

Однако приведенный вами пример упорядочения не является обычным буквенно-цифровым (лексикографическим) упорядочением, насколько я знаю. Вместо этого это будет:

10A
1A
2A
A1
A10
A11
A2
B2
B4

Если вы действительно хотите, чтобы порядок, который вы указали, вам нужно было бы более креативным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...