Почему я не могу отсортировать этот список?

StackOverflow https://stackoverflow.com/questions/1815528

  •  07-07-2019
  •  | 
  •  

Вопрос

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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top