Сортировать поплавок в списке списков в Python? - PullRequest
3 голосов
/ 07 октября 2011

Я пытаюсь отсортировать структуру вложенных списков на основе последних значений каждого из вложенных списков. Мой список выглядит так:

li = [['a1', 1, 1.56], ['b3', '6', 9.28], ['c2', 1, 6.25]...]

Вывод, который я хотел бы получить:

['b3', '6', 9.28]
['c2', 1, 6.25]
['a1', 1, 1.56]

Я пробовал несколько решений, которые не работали с использованием itemgetter, например:

 rank_list = [i.sort(key=itemgetter(2)) for i in li]

Что я делаю не так? Есть ли лучший способ сортировки вложенных списков? Я получаю AttributeError: 'str' object has no attribute 'sort'. Спасибо за помощь.

Ответы [ 4 ]

4 голосов
/ 07 октября 2011

Вы близки к одному из ваших подходов, но то, что вы действительно хотите, это:

li.sort(key = itemgetter(2), reverse = True)
0 голосов
/ 07 октября 2011

Давайте проясним наше мышление о проблеме.

[i.sort (key = itemgetter (2)) для i в li]

Это означает "взятькаждый подсписок и отсортировать его элементы (список и две строки), используя пункт 2 каждого в качестве ключа; собрать список возвращаемых значений из этих операций ".Элементами ваших подсписков являются целочисленные значения и строки;целые числа не являются последовательностями вообще (поэтому вы не можете получить элемент из них), и некоторые из ваших строк слишком короткие (когда я пробую ваш пример, я не получаю ошибку, которую вы цитируете, а вместо этого "IndexError:индекс строки вне диапазона ", как и ожидалось).Даже если бы это сработало, вы бы просто получили список None значений, потому что .sort в списке сортирует список на месте и возвращает None.

То, что вы хотите, это «дай мне»версия этого списка списков "отсортировано по элементу 2 каждого элемента".Это sorted(li, key=itemgetter(2)).Список-списки - это то, что вы сортируете, поэтому вы передаете функцию сортировки.Вы хотите, чтобы сортировка давала новое значение и не влияла на вещи на месте, поэтому вместо нее вы используете бесплатную функцию sorted.

0 голосов
/ 07 октября 2011

Строки не могут быть отсортированы, вот что AttributeError: 'str' object has no attribute 'sort' хочет вам сказать.

Вы хотите отсортировать list li

 rank_list = sorted(li, key=itemgetter(2)) # to obtain a sorted copy of li
 # or just sort in place:
 li.sort(key=itemgetter(2))

Что бы вы ни делали, это не то, что вы отправили:

>>> rank_list = [i.sort(key=itemgetter(2)) for i in li]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
0 голосов
/ 07 октября 2011
rank_list = sorted(li, key=itemgetter(2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...