Почему я не могу отсортировать этот список? - PullRequest
3 голосов
/ 29 ноября 2009
statlist = [('abc',5,1), ('bzs',66,1), ... ]
sorted(statlist, key=lambda x: int(x[1]))

Я хочу отсортировать по целому числу от наибольшего к наименьшему. В данном случае 5 и 66. Но, похоже, это не работает.

Ответы [ 8 ]

7 голосов
/ 29 ноября 2009

Используйте метод .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)
7 голосов
/ 29 ноября 2009

Функция sorted возвращает список new , поэтому вам необходимо присвоить результаты функции следующим образом:

new_list = sorted(statlist, key=lambda x: int(x[1])) 
3 голосов
/ 29 ноября 2009

для сортировки на месте

statlist.sort(key=lambda x: x[1])

для создания другого списка, с отсортированными данными используйте

otherlist = sorted( statlist, key=lambda x: x[1] )
3 голосов
/ 29 ноября 2009

Вы можете передать, ввести ключ и вернуться к функции .sort

>>> x.sort(key=lambda x:x[1],reverse=True)
>>> x
[('bzs', 66, 1), ('abc', 5, 1)]
>>>
2 голосов
/ 29 ноября 2009
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)
1 голос
/ 30 ноября 2009

В ответ на комментарий Алекса, что он думал, что 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]

Вот совет: ищите закономерности и сходства, но всегда проверяйте свои интуитивные экстраполяции. Возможно, вы захотите применить эти идеи к reverse и reversed.

0 голосов
/ 27 апреля 2014

Эй, когда я что-то сохраняю в массив, я не склонен беспокоиться о порядке, а затем в конце я использую 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)
0 голосов
/ 29 ноября 2009
>>> 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)]
...