@immelnikoff
Изучаю БД

Почему список списков не хочет сортироваться sort()?

Есть список списков:
s = [['2019', 1], ['2018', 0], ['2017', 'qwe']] # первые эл-ты вложенных списков – строки; вторые – либо строка, либо число

Сортирую его по первым элементам вложенных списков неявно:
s.sort()
Результат – ошибка:
builtins.TypeError: '<' not supported between instances of 'str' and 'int'
Если же сортирую с явным указанием, что сортировать нужно по первым элементам вложенных списков, то сортировка проходит:
s.sort(key = lambda x: x[0])
Почему так?

ps.
>>> import sys
>>> sys.version
>>> '3.6.0 (default, Jan 23 2017, 17:35:20) [MSC v.1900 32 bit (Intel)]'
  • Вопрос задан
  • 232 просмотра
Пригласить эксперта
Ответы на вопрос 2
deepblack
@deepblack Куратор тега Python
Способ сравнения в Python 3.0 изменен по сравнению с Python 2.6 Смотрите Лутц М. Изучаем Python (4-е издание, 2011) стр.261 .

В Python 2.6 и в более ранних версиях способ упорядочения основан на именах типов, вовлеченных в операцию сравнения, например любые целые числа всегда меньше любых строк, потому что строка “int” меньше, чем строка “str”.
При выполнении операции сравнения никогда не выполняется преобразование типов объектов, за исключением сравнивания объектов числовых типов.
В Python 3.0 такой порядок был изменен: попытки сравнивания объектов различных типов возбуждают исключение – вместо сравнивания по названиям типов. Так как метод сортировки использует операцию сравнения, это означает, что инструкция [1, 2, ‘spam’].sort()будет успешно выполнена в Python 2.X, но возбудит исключение в версии Python 3.0 и выше.
Кроме того, в версии Python 3.0 больше не поддерживается возможность передачи методу sort произвольной функции сравнения, для реализации иного способа упорядочения.
Чтобы обойти это ограничение, предлагается использовать именованный аргумент key=func, в котором предусматривать возможность трансформации значений в процессе сортировки.

Ответ написан
Комментировать
NeiroNx
@NeiroNx
Программист
потому что 'qwe' нельзя сравнить с 0
когда не указан элемент то сравниваются все элементы массива.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы