2015-06-22 3 views
0

У меня есть список со словарями, в котором я сортирую их по разным значениям. Я делаю это с этими строками кода:Сортировка, когда значения равны None или пустые строки python

def orderBy(self, col, dir, objlist): 
    if dir == 'asc': 
     sorted_objects = sorted(objlist, key=lambda k: k[col]) 
    else: 
     sorted_objects = sorted(objlist, key=lambda k: k[col], reverse=True) 
    return sorted_objects 

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

Я не уверен, но я думаю, что это исключение, которое выбрано: unorderable types: NoneType() < NoneType(). Это происходит, когда в столбце, который я пытаюсь сортировать, нет значений None. Для пустых значений строки он работает, хотя они заканчиваются первым в списке, но я бы хотел, чтобы они были последними.

Как я могу решить эту проблему?

+1

Точно * как * это сломаться? –

+3

Боковое примечание: не используйте 'if..else', когда вы можете просто выполнить сортировку (..., reverse = dir! = 'Asc')' здесь. –

+3

Здесь вы должны предоставить нам некоторые данные примера; покажите нам, что произойдет с этим, и то, что ожидалось от yu. –

ответ

3

Если вы хотите, чтобы значения None и '' отображались последними, вы можете вернуть функцию key в кортеж, поэтому список сортируется по естественному порядку этого кортежа. Кортеж имеет форму (is_none, is_empty, value); таким образом, кортеж для значения None будет (1, 0, None), для '' является (0, 1, '') и для чего-либо еще (0, 0, "anything else"). Таким образом, сначала будут отсортированы правильные строки, затем пустые строки и, наконец, None.

Пример:

>>> list_with_none = [(1,"foo"), (2,"bar"), (3,""), (4,None), (5,"blub")] 
>>> col = 1 
>>> sorted(list_with_none, key=lambda k: (k[col] is None, k[col] == "", k[col])) 
[(2, 'bar'), (5, 'blub'), (1, 'foo'), (3, ''), (4, None)] 
+0

Работал отлично! @tobias_k – Eitre

+0

@tobias_k: Один вопрос ... порядок элементов в '(k [col] равен None, k [col] ==" ", k [col]))' afftect order в списке вывода? –

+0

@ KhalilAmmour- خليلعمور Конечно, в этом вся идея. Кортежи будут отсортированы по их первым элементам, и если они будут равны, то вторым элементом и т. Д. –

Смежные вопросы