Почему я не могу отсортировать этот список?
Вопрос
statlist = [('abc',5,1), ('bzs',66,1), ... ]
sorted(statlist, key=lambda x: int(x[1]))
Я хочу отсортировать его по целому числу от наибольшего к наименьшему. В этом случае 5 и 66. Но, похоже, это не работает.
Решение
Функция sorted
возвращает список new , поэтому вам нужно будет присвоить результаты функции следующим образом:
new_list = sorted(statlist, key=lambda x: int(x[1]))
Другие советы
Используйте метод .sort
для сортировки на месте:
statlist = [('abc',5,1), ('bzs',66,1), ... ]
statlist.sort(key=lambda x: int(x[1]))
Если вы хотите использовать sorted
, переназначьте переменную:
statlist = [('abc',5,1), ('bzs',66,1), ... ]
statlist = sorted(statlist, key=lambda x: int(x[1]))
Для сортировки по убыванию используйте reverse
:
statlist = [('abc',5,1), ('bzs',66,1), ... ]
statlist = sorted(statlist, key=lambda x: int(x[1]), reverse=True)
Тогда вам лучше использовать itemgetter
вместо lambda
:
import operator
statlist = [('abc',5,1), ('bzs',66,1), ... ]
statlist = sorted(statlist, key=operator.itemgetter(1), reverse=True)
Вы можете передать, ввести ключ и вернуться к функции .sort
>>> x.sort(key=lambda x:x[1],reverse=True)
>>> x
[('bzs', 66, 1), ('abc', 5, 1)]
>>>
для сортировки на месте
statlist.sort(key=lambda x: x[1])
для создания другого списка с использованием отсортированных данных
otherlist = sorted( statlist, key=lambda x: x[1] )
from operator import itemgetter
statlist = [('abc',5,1), ('bzs',66,1), ... ]
# statlist.sort modifiest the statlist, sorted returns a new one
# reverse puts the largest items to the front
statlist.sort(key=itemgetter(1), reverse=True)
В ответ на комментарий Алекса о том, что он считает, что sorted () работает как функция сортировки:
Если это сработало "как функция сортировки", вряд ли это было бы помещено в библиотеку.
В любом случае, функция отсутствует ... вы ссылаетесь на метод объектов списка.
Простая демонстрация с использованием интерактивного переводчика:
>>> alist = [3, 2, 1]; x = alist.sort(); print x; print alist
None
[1, 2, 3]
>>> alist = [3, 2, 1]; x = sorted(alist); print x; print alist
[1, 2, 3]
[3, 2, 1]
Вот совет: ищите закономерности и сходства, но всегда проверяйте интуитивные экстраполяции. Возможно, вы захотите применить эти идеи к реверс
и реверс
.
>>> s = [('xyz', 8, 1), ('abc',5,1), ('bzs',66,1) ]
>>> s = sorted(s, key=lambda x: int(x[1]))
>>> s.reverse()
>>> print s
[('bzs', 66, 1), ('xyz', 8, 1), ('abc', 5, 1)]
Привет, когда я сохраняю что-то в массив, я не склонен беспокоиться о порядке, а затем в конце я использую sorted ()
, например, вот так: statlist = sorted ( statlist)
и если вы хотите, чтобы он был от наименьшего к меньшему statlist = sorted (statlist, reverse = True)
Это простой способ получить значение от наибольшего к наименьшему!
Пример кода, в котором я это использовал (только выдержка)
while i <= math.sqrt(intnum):
if (intnum % i) == 0:
numbers.insert(0,i)
numbers.insert(0,int(intnum/i))
print(i,":", int(intnum/i))
i += 1
numbers = sorted(numbers, reverse = True)