Немного базы Python. День 5. Сортировка списка по убыванию
Метод
Чтобы
У метода
Помните:
Метод
Если вы попробуете создать новый объект с помощью
У метода
Этот параметр используется для передачи функции, которая задает критерий сортировки элементов списка.
В примере ниже у нас список кортежей, и мы хотим отсортировать его по возрасту студента. Используя параметр
Метод
Если у двух элементов одинаковый ключ сортировки, их исходный порядок сохраняется. Например, если у
Как видно, порядок элементов
👉 @PythonPortal
Метод
sort() сортирует список по возрастанию (по умолчанию).Чтобы
sort() работал, элементы списка должны быть одного типа. Нельзя сортировать список со смешанными типами данных, например числа и строки.У метода
sort() есть параметр reverse; чтобы отсортировать список по убыванию, установите reverse=True.list1 = [2, 5, 6, 8, 1, 8, 9, 11]
list1.sort(reverse=True)
print(list1)
# [11, 9, 8, 8, 6, 5, 2, 1]
Помните:
sort() это строго метод списка (list). Его нельзя использовать для сортировки set, tuple, string или dictionary.Метод
sort() не возвращает новый список; он сортирует существующий список на месте (in place).Если вы попробуете создать новый объект с помощью
sort(), он вернет None. Пример ниже:list1 = [2, 5, 6, 8, 1, 8, 9, 11]
list2 = list1.sort(reverse=True)
print(list2)
# None
У метода
sort() есть необязательный параметр key, который позволяет настроить поведение сортировки.Этот параметр используется для передачи функции, которая задает критерий сортировки элементов списка.
В примере ниже у нас список кортежей, и мы хотим отсортировать его по возрасту студента. Используя параметр
key вместе с lambda-функцией, можно реализовать такую кастомную сортировку. См. ниже:students = [
("Alice", 22),
("Bob", 20),
("Charlie", 24)
]
# Сортируем студентов по возрасту, используя lambda-функцию как key
students.sort(key=lambda students: students[1])
print(students)
# [('Bob', 20), ('Alice', 22), ('Charlie', 24)]
Метод
sort() является стабильным (stable), то есть сохраняет относительный порядок равных элементов в отсортированном списке.Если у двух элементов одинаковый ключ сортировки, их исходный порядок сохраняется. Например, если у
"Alice" и "Bob" одинаковый возраст, их порядок останется прежним. Это и называется стабильной сортировкой (stable sorting). См. пример:students = [
("Alice", 22),
("Bob", 22),
("Charlie", 24)
]
# Сортируем студентов по возрасту, используя lambda-функцию как key
students.sort(key=lambda students: students[1])
print(students)
# [('Alice', 22), ('Bob', 22), ('Charlie', 24)]
Как видно, порядок элементов
"Alice" и "Bob" не изменился, потому что у них одинаковый возраст.Please open Telegram to view this post
VIEW IN TELEGRAM
❤21👍8
Перестаньте использовать
В Python, когда вы пишете:
вы не проверяете напрямую, является ли
Да, во многих случаях результат будет таким же, как у кода:
Но поведение у этих двух вариантов разное, и эта разница важна.
Когда вы используете:
Python вызывает метод
Если
Пример:
Здесь видно, что
Из этого следует, что при использовании
С другой стороны, когда вы пишете:
вы используете оператор
Оператор
❤️ Поэтому всегда рекомендуется, и это best practice, использовать
👉 @PythonPortal
if obj == None, используйте if obj is NoneВ Python, когда вы пишете:
obj == None
вы не проверяете напрямую, является ли
obj значением None. Вместо этого вы спрашиваете, равен ли объект None.Да, во многих случаях результат будет таким же, как у кода:
obj is None
Но поведение у этих двух вариантов разное, и эта разница важна.
Когда вы используете:
obj == None
Python вызывает метод
__eq__ у объекта. То есть сам объект решает, что значит "равен None". А этот метод можно переопределить.Если
obj это экземпляр класса, в котором __eq__ реализован так, что при сравнении с None возвращается True (даже если объект на самом деле не None), тогда obj == None может ошибочно дать True.Пример:
class Weird:
def __eq__(self, other):
return True # Всегда утверждает, что равен
obj = Weird()
print(obj == None) # True
print(obj is None) # False
Здесь видно, что
obj == None возвращает True из-за кастомного поведения оператора __eq__ в классе.Из этого следует, что при использовании
obj == None результат не всегда предсказуем.С другой стороны, когда вы пишете:
obj is None
вы используете оператор
is, который нельзя переопределить. Это значит, что результат всегда будет одинаковым и предсказуемым.Оператор
is проверяет идентичность объектов, то есть указывают ли две ссылки на один и тот же объект. Поскольку None это singleton (единственный экземпляр), obj is None это правильный и самый эффективный способ такой проверки.obj is None вместо obj == None ради предсказуемости и эффективности.Please open Telegram to view this post
VIEW IN TELEGRAM
👍28❤5🔥2