11 subscribers
38 photos
2 links
Download Telegram
Что такое списковые включения?
Списковое включение — это способ компактно и удобно создавать списки, выполняя цикл прямо внутри квадратных скобок.

Примеры использования
1. Простая трансформация списка
numbers = [1, 2, 3, 4, 5]
squared = [x ** 2 for x in numbers]
print(squared) # Вывод: [1, 4, 9, 16, 25]

5. Сложные выражения
Списковые включения поддерживают любые выражения:
numbers = [1, 2, 3, 4]
results = [x ** 2 if x % 2 == 0 else x ** 3 for x in numbers]
print(results) # Вывод: [1, 4, 27, 16]

Что нельзя делать в списковых включениях
Сложные конструкции, которые ухудшают читаемость
Если включение становится слишком громоздким, лучше использовать обычный цикл:
# Не стоит делать так
result = [x ** 2 if x > 0 else -x for x in range(-10, 10) if x != 0]

#Вместо этого:
result = []
for x in range(-10, 10):
if x != 0:
result.append(x ** 2 if x > 0 else -x)
Кортежи:
Кортежи

Кортежи очень похожи на списки, они тоже являются индексированной коллекцией, только вместо квадратных в них используются круглые скобки (причем их часто можно пропускать):


# кортеж из двух элементов; тип элементов может быть любой
card = ('7', 'spades')

# пустой кортеж (из 0 элементов)
empty = ()

# кортеж из 1 элемента - запятая нужна, чтобы отличить от обычных скобок
t = (18,)

# длина, значение отдельного элемента, сложение - как у списков
print(len(card), card[0], card + t)
Кортежи можно сравнивать между собой:
(1, 2) == (1, 3)    # False
(1, 2) < (1, 3) # True
(1, 2) < (5,) # True
('7', 'clubs') > ('7', 'hearts') # False

# А вот так сравнивать нельзя: элементы кортежей разных типов
(1, 2) < ('7', 'spades')
Неизменяемость

Важнейшее техническое отличие кортежей от списков — неизменяемость. Как и к строке, к кортежу нельзя добавить элемент методом append, а существующий элемент нельзя изменить, обратившись к нему по индексу. Это выглядит недостатком, но в дальнейшем мы поймем, что у кортежей есть и преимущества.
n, s = 10, 'hello'
# то же самое, что
n = 10
s = 'hello'

В примере выше мы создали кортеж, стоящий справа от =, прямо на этой же строчке. Но можно заготовить его и заранее:

cards = [('7', 'spades'), ('Д', 'clubs'), ('Т', 'spades')]
value, suit = cards[0]
print('Достоинство карты:', value) # 7, присваивается по очерёдно первый индекс
print('Масть карты:', suit) # spades, а затем второй
Итак, на данный момент мы знаем уже четыре вида коллекций: строки, списки, множества и кортежи. У вас может возникнуть вопрос: можно ли из одной коллекции сделать другую?
Зачем нужно преобразование коллекций?

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


s = 'beaytiful'   # Написали с ошибкой
a = list(s) # a == ['b', 'e', 'a', 'y', 't', 'i', 'f,' 'u', 'l']
a[3] = 'u' # a == ['b', 'e', 'a', 'u', 't', 'i', 'f,' 'u', 'l']
Если ваш код работает, но вы хотите устранить предупреждения:

1. Отключите строгую проверку типов для данного участка
Добавьте комментарий, чтобы анализатор игнорировал это место:

# type: ignore
a[1] = 1828 # type: ignore
Преобразование списка или строки во множество позволяет получить очень интересные результаты. Как вы помните, все элементы множества должны быть уникальны, поэтому при преобразовании списка во множество каждый элемент останется только в одном экземпляре. Таким образом, можно очень легко убрать повторяющиеся элементы и узнать, сколько элементов встречается в списке хотя бы один раз:


a = [1, 2, 1, 1, 2, 2, 3, 3]
print('Количество элементов в списке без повторений: ', len(set(a))) # 3
вероятность событий (чисто для себя)
ДЛЯ СОЗДАНИЯ ПУСТОГО КОРТЕЖА ИСПОЛЬЗУЕТСЯ:

empty_tuple = tuple()
Вложенные списки:
Обход элементов внутри вложенных списков
способ создания вложенного списка на одной строке:
table = [[int(el) for el in input().split()] for _ in range(n)] # [int(el) for el in input().split()] создаётся 1 отдельный вложенный список тем что запрашивается строчный ввод который превращается в целые числа разделённые запятой, который попадает в конец основного списка и далее создаются остальные с помощью for _ in range(n)
first_name = 'Сильвестр'
last_name = 'Сталлоне'
print(actors[first_name + ' ' + last_name])

Если ключа в словаре нет, возникнет ошибка:

print(actors['Несуществующий ключ'])
KeyError: 'Несуществующий ключ'
Удаление, добавление элементов в словари:
6. Нестроковые ключи
Решим следующую задачу. Пусть дан длинный список целых чисел numbers. Мы знаем, что некоторые числа встречаются в этом списке несколько раз. Нужно узнать, сколько именно раз встречается каждое из чисел.

numbers = [1, 10, 1, 6, 4, 10, 4, 2, 2, 1, 10, 1]
counts = {}
for number in numbers:
if number not in counts:
counts[number] = 1
else:
counts[number] += 1


Просто так сделать counts[number] += 1 нельзя: если ключа number в словаре нет, возникнет ошибка KeyError.

В результате работы этой программы все элементы из списка numbers окажутся ключами словаря counts. Значением counts[x] будет количество раз, которое число x встретилось в списке numbers. Как это работает?

Цикл for перебирает все элементы списка numbers и для каждого проверяет, присутствует ли он уже в качестве ключа в counts. Если нет — значит, число встретилось нам впервые и мы инициализируем значение counts[numbers] = 1. Иначе увеличим counts[number] на единицу, поскольку число number встретилось нам повторно.

Почему для этой задачи не стоит использовать список, хотя ключи — обычные целые числа? Потому что, используя словарь, мы можем решить эту задачу и для вещественных чисел, и для очень больших целых чисел, и вообще для любых объектов, которые можно сравнивать.