Запрос Python: list.sort (), когда список содержит разные типы элементов

Приветствия Питоновского мира. День 4 обучения Python 3.3, и я столкнулся с странным свойством list.sort .

Я создал список из пяти элементов: четыре строки, число которых посередине. Попытка получить list.sort для работы дала ожидаемую ошибку из-за типов микширования:

 >>> list = ['b', 'a', 3, 'd', 'c'] >>> list.sort() Traceback (innermost last): File "<stdin>", line 1, in <module> TypeError: unorderable types: int() < str() >>> list ['b', 'a', 3, 'd', 'c'] 

Список не изменился.

Но потом я переместил номер до конца, снова использовал list.sort и получил следующее:

 >>> list = ['b', 'a', 'd', 'c', 3] >>> list.sort() Traceback (innermost last): File "<stdin>", line 1, in <module> TypeError: unorderable types: int() < str() >>> list ['a', 'b', 'c', 'd', 3] 

ОК, ошибка. Но список отсортировался, доведя номер до конца. Я не мог найти никаких объяснений этому на этом сайте или в Лангтангене. Есть ли какая-то основная причина такого поведения? Было бы полезно в какой-то ситуации?

2 Solutions collect form web for “Запрос Python: list.sort (), когда список содержит разные типы элементов”

Из документов Python 3:

Этот метод сортирует список на месте, используя только <сравнения между элементами. Исключения не подавляются – если какие-либо операции сравнения не выполняются, вся операция сортировки завершится неудачно (и список, вероятно, останется в частично измененном состоянии).

Документы не гарантируют какого-либо поведения в частности, но элементы, скорее всего, будут частично отсортированы. Порядок сортировки, в котором они находились, когда произошло исключение, и этот порядок может варьироваться в зависимости от реализации или, возможно, (но маловероятно) двух последующих прогонов программы.

Если вы хотите попытаться отсортировать элементы, не беспокоясь о неудачном переупорядочении, вы можете использовать sorted встроенную функцию, которая вернет новый список, а не изменит оригинал.

 >>> seq = ['b', 'a', 3, 'd', 'c'] >>> try: ... seq = sorted(seq) # if sorted fails, result won't be assigned ... except Exception: # you may only want TypeError ... pass ... >>> seq ['b', 'a', 3, 'd', 'c'] # list unmodified 

РЕДАКТИРОВАТЬ: всем, кто говорит что-то вроде

когда он видит два разных типа, он вызывает исключение

Я знаю, что вы, вероятно, знаете, что такое заявление является упрощением, но я думаю, что без ясности это вызовет путаницу.

Следующий пример состоит из двух классов A и B которые поддерживают сравнение друг с другом через их соответствующие методы __lt__ . Он показывает список, смешанный из этих двух типов, отсортированный по list.sort() а затем напечатан в отсортированном порядке без каких-либо исключений:

 class A: def __init__(self, value): self.a = value def __lt__(self, other): if isinstance(other, B): return self.a < other.b else: return self.a < other.a def __repr__(self): return repr(self.a) class B: def __init__(self, value): self.b = value def __lt__(self, other): if isinstance(other, A): return self.b < other.a else: return self.b < other.b def __repr__(self): return repr(self.b) seq = [A(10), B(2), A(8), B(16), B(9)] seq.sort() print(seq) 

Результатом этого является:

 [2, 8, 9, 10, 16] 

не важно, чтобы вы понимали каждую деталь этого. Это просто иллюстрирует, что список смешанных типов может работать с list.sort() если все части находятся там

Это ничего необычного. Просто sort() не проверяет, содержит ли список совместимые типы данных, вместо этого он пытается сортировать. Итак, как только ваш элемент находится в конце, он анализируется в последнее время, и поэтому алгоритм сортировал часть списка до того, как обнаружил ошибку.

И нет – это не полезно, так как это сильно зависит от реализованного механизма сортировки.

  • Правильное использование глобальных переменных в Python 3
  • Почему функция печати возвращает NoneType?
  • Python 3.1.1 с --enable-shared: не будет создавать никаких расширений
  • python3 - узнав о поиске, этот очень простой пример не работает правильно
  • Преобразование списка в вложенный словарь
  • Лучший способ проверить, присутствует ли элемент в списке списков?
  • Использовать графический интерфейс для открытия каталога в Python 3
  • Исключение Python 3 удаляет переменную в закрывающей области по неизвестной причине
  • Python - лучший язык программирования в мире.