Python Portal
55.3K subscribers
2.47K photos
401 videos
51 files
1.01K links
Всё самое интересное из мира Python

Связь: @devmangx

РКН: https://clck.ru/3GMMF6
Download Telegram
Немного базы Python. День 5. Сортировка списка по убыванию

Метод 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" не изменился, потому что у них одинаковый возраст.

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
21👍8
Главное захотеть 🧠

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
😁393🤔2
Перестаньте использовать 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 это правильный и самый эффективный способ такой проверки.

❤️ Поэтому всегда рекомендуется, и это best practice, использовать obj is None вместо obj == None ради предсказуемости и эффективности.

👉 @PythonPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍285🔥2