2015-11-24 4 views
1

У меня есть список под названием columnVariable. Этот список содержит кучу экземпляров класса. Каждый класс имеет свойство SequenceNumberPython: Сортировка списка классов

, когда я запускаю следующую команду:

for obj in columnVariable: 
print obj.sequenceNumber 

я получаю следующие выходные данные

3 
1 
2 
10 
11 

Я хотел бы, чтобы отсортировать список по недвижимости SequenceNumber. Выход мне нравится:

1 
2 
3 
10 
11 

Когда я попробовать следующее:

for obj in columnVariable: 
print sorted(obj.sequenceNumber) 

я получить выход

[u'3'] 
[u'1'] 
[u'2'] 
[u'0', u'1'] 
[u'1', u'1'] 

Похоже, каждый индивидуальный номер последовательности сортируется вместо сортировки элементы в списке на основе порядкового номера.

Я новичок в python, и поэтому небольшая помощь будет оценена. Благодаря!

+0

'печать отсортирован (columnVariable, ключ = лямбда х: x.sequenceNumber)' –

+3

подсказка: 'ключ = лямбда х: Int (x.sequenceNumber) ' –

ответ

3

Вы должны использовать отсортированный с key аргументом. например.

from operator import attrgetter 

for obj in sorted(columnVariable, key=attrgetter('sequenceNumber')): 
    print(obj) 

Edit:

Так как вы хотите, чтобы отсортировать строки численно, это более целесообразно использовать функцию лямбда здесь

for obj in sorted(columnVariable, key=lambda x: int(x.sequenceNumber)): 
    print(obj) 

Некоторые люди борются, чтобы понять lambda функции, поэтому я упомяну что нормально писать нормальное определение функции для вашей ключевой функции

def int_sequence_number_key(obj): 
    return int(obj.sequenceNumber) 

for obj in sorted(columnVariable, key=int_sequence_number_key): 
    print(obj) 

Теперь также можно писать тесты для int_sequence_number_key что важно для покрытия угловых случаев (например, что произойдет, если вы можете иметь None или некоторые другие объекты, которые не могут быть преобразованы в int)

+0

'sequenceNumber' не является списком, это строковое целое. – ppperry

+0

Ницца. Что, если 'sequenceNumber' является строкой? (Похоже, это может быть так.) –

+0

@ppperry, в этом случае этот ответ (используя attrgetter), вероятно, не то, что вы хотите. Вы должны использовать лямбда, но включать int.Я добавлю это к своему ответу –

4

вы можете попробовать это:

print sorted(columnVariable, key = lambda x: int(x.sequenceNumber)) 
+0

woah. слово в слово (y) –

+0

@RNar даже имя переменной лямбда-выражения ... – gefei

0

питоном sorted функции принимает key функционируют как аргумент, который можно использовать для указания способа сортировки. В этом случае вы должны использовать sorted(columnVariable, key=lambda x:x.sequenceNumber).

Приведенный выше код можно быстрее с помощью модуля управления:

from operator import attrgetter 
sorted(columnVariable, key=attergetter("sequenceNumber")). 
Смежные вопросы