11 subscribers
38 photos
2 links
Download Telegram
Итак, на данный момент мы знаем уже четыре вида коллекций: строки, списки, множества и кортежи. У вас может возникнуть вопрос: можно ли из одной коллекции сделать другую?
Зачем нужно преобразование коллекций?

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


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 встретилось нам повторно.

Почему для этой задачи не стоит использовать список, хотя ключи — обычные целые числа? Потому что, используя словарь, мы можем решить эту задачу и для вещественных чисел, и для очень больших целых чисел, и вообще для любых объектов, которые можно сравнивать.
list(map(int, input().split())))
Возврат из глубины функции
Множественные точки возврата из функции позволяют нам упростить обработку и более сложных структур, например, вложенных списков. Наша следующая программа будет проверять, есть ли в матрице элемент, отличающийся от искомого не больше чем на число eps.

Матрица записывается как список списков. Мы предполагаем, что наша функция будет работать с большими матрицами, поэтому нам не хочется тратить лишнее время на проверку. Мы будем прекращать поиск, как только нашли подходящий элемент. Давайте для начала разберемся, как бы мы действовали без множественных операторов return.

def matrix_has_close_value(matrix, value, eps):
found = False
for row in matrix:
for cell in row:
if abs(cell - value) <= eps:
found = True
break
if found:
break
if found:
return True
else:
return False

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

Перепишем теперь функцию с учетом того, что, как только мы нашли элемент, мы уже знаем, что ответ — True (т. е. элемент содержится в матрице). А если мы закончили перебор элементов и так и не нашли ни одного элемента, ответ False.

def matrix_has_close_value(matrix, value, eps):
for row in matrix:
for cell in row:
if abs(cell - value) <= eps:
return True
return False

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