<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 <h1>Содержание<span class="tocSkip"></span></h1>
<div class="toc"><ul class="toc-item"><li><span><a href="#Базовые-операции" data-toc-modified-id="Базовые-операции-1">Базовые операции</a></span><ul class="toc-item"><li><span><a href="#Создание-списка" data-toc-modified-id="Создание-списка-1.1">Создание списка</a></span></li><li><span><a href="#Доступ-к-элементам" data-toc-modified-id="Доступ-к-элементам-1.2">Доступ к элементам</a></span></li><li><span><a href="#Добавление-элемента-в-конец" data-toc-modified-id="Добавление-элемента-в-конец-1.3">Добавление элемента в конец</a></span></li><li><span><a href="#Длина-списка" data-toc-modified-id="Длина-списка-1.4">Длина списка</a></span></li><li><span><a href="#Сортировка" data-toc-modified-id="Сортировка-1.5">Сортировка</a></span></li><li><span><a href="#Сложение" data-toc-modified-id="Сложение-1.6">Сложение</a></span></li><li><span><a href="#Особенности-присваивания-списков" data-toc-modified-id="Особенности-присваивания-списков-1.7">Особенности присваивания списков</a></span></li></ul></li><li><span><a href="#Списки-и-if" data-toc-modified-id="Списки-и-if-2">Списки и if</a></span><ul class="toc-item"><li><span><a href="#Преобразование-к-логическому-значению" data-toc-modified-id="Преобразование-к-логическому-значению-2.1">Преобразование к логическому значению</a></span></li><li><span><a href="#Проверка-наличия-элемента-в-списке" data-toc-modified-id="Проверка-наличия-элемента-в-списке-2.2">Проверка наличия элемента в списке</a></span></li></ul></li><li><span><a href="#Списки-и-for" data-toc-modified-id="Списки-и-for-3">Списки и for</a></span></li><li><span><a href="#Списки-и-строки" data-toc-modified-id="Списки-и-строки-4">Списки и строки</a></span><ul class="toc-item"><li><span><a href="#Split-—-разбиение-строки" data-toc-modified-id="Split-—-разбиение-строки-4.1">Split — разбиение строки</a></span></li><li><span><a href="#Join-—-объединение-строк" data-toc-modified-id="Join-—-объединение-строк-4.2">Join — объединение строк</a></span></li><li><span><a href="#Изменение-символа-строки" data-toc-modified-id="Изменение-символа-строки-4.3">Изменение символа строки</a></span></li></ul></li><li><span><a href="#Распаковка-списков" data-toc-modified-id="Распаковка-списков-5">Распаковка списков</a></span></li><li><span><a href="#Другие-операции" data-toc-modified-id="Другие-операции-6">Другие операции</a></span><ul class="toc-item"><li><span><a href="#Минимум" data-toc-modified-id="Минимум-6.1">Минимум</a></span></li><li><span><a href="#Сумма" data-toc-modified-id="Сумма-6.2">Сумма</a></span></li><li><span><a href="#Индекс-элемента" data-toc-modified-id="Индекс-элемента-6.3">Индекс элемента</a></span></li><li><span><a href="#Удаление-элемента" data-toc-modified-id="Удаление-элемента-6.4">Удаление элемента</a></span></li><li><span><a href="#Вставка-элемента" data-toc-modified-id="Вставка-элемента-6.5">Вставка элемента</a></span></li><li><span><a href="#Переворачивание-списка" data-toc-modified-id="Переворачивание-списка-6.6">Переворачивание списка</a></span></li></ul></li></ul></div>
Списки
Списки (list) — это некоторое подобие массива в "привычных" вам языках программирования лишь с тем отличием, что в list могут храниться элементы разных типов. Давайте попробуем разобраться на примерах.
Базовые операции
Создание списка
Step1:  Можно создать список из однотипных элементов заданной длины
Step2:  Доступ к элементам
Step3:  Обратите внимание, что при выведении списка таким способом он выводится с квадратными скобками и запятыми.
В Python есть отрицательная индексация. −1 элемент это последний элемент, −2 элемент это предпоследний элемент списка и так далее
Step4:  Добавление элемента в конец
Метод append добавляет новый элемент в конец существующего списка
Step5:  Длина списка
Функция len позволяет узнать длину (размер) списка
Step6:  Сортировка
Метод sort сортирует текущий список по невозрастанию, если это возможно
Step7:  Сложение
Списки можно складывать друг с другом. При этом создаётся новый список, в котором сначала идут элементы одного списка, затем другого.
Step8:  Особенности присваивания списков
Во время выполнения интерпретатор хранит все данные, которые у вас есть в программе, как некоторый набор объектов. Примеры объектов
Step9:  Чтобы узнать как скопировать список, читайте страницу про срезы.
Почему то же самое не происходит с другими типами, например числами? Рассматривайте каждое отдельное число тоже как отдельный объект, на который может вести ссылка. Например, 2 это объект, и 3 это объект. При изменении значения переменной меняется только ссылка, а не объект.
Step10:  Списки и if
Преобразование к логическому значению
Пустой список преобразуется к логическому значению False
Step11:  Непустой список преобразуется к True
Step12:  Проверка наличия элемента в списке
Проверить, есть ли элемент в списке, можно с помощью оператора in. Это то же самое, что и пройти по всему списку и для каждого элемента проверить, не равен ли он искомому.
Step13:  Также есть аналогичный оператор not in, который проверяет, что элемента нет в списке
Step14:  Списки и for
Есть специальный синтаксис цикла for, который позволяет пройтись по каждому элементу списка. В этом случае переменной присваивается не индекс элемента, а именно значение
Step15:  В каком-то смысле range тоже похож на list
Step16:  Списки и строки
Split — разбиение строки
Метод split разбивает строку на список строк по выбранному разделяющему символу или нескольким символам. Например для разбивания строки по символу #
Step17:  По умолчанию (без параметров) split разбивает строку по пробельным символам, игнорируя подряд идущие пробельные символы
Step18:  Пример строки-разделителя более чем из одной буквы
Step19:  Join — объединение строк
Метод join возвращает строку, в которой все элементы списка записаны через разделительный символ (символы). Каждый элемент списка обязательно должен быть строкой.
Step20:  Разделительная строка может быть пустой
Step21:  Обратите внимание, что разделитель ставится только между строками, и никогда в конце.
Разделитель из нескольких символов
Step22:  Разделитель в виде перевода строки
Step23:  Изменение символа строки
Строки являются неизменяемым типом, но достаточно часто встречается ситуация, когда нам нужно изменить один символ в строке. В таких случаях
Step24:  Также существует другой способ изменить третий символ строки, используя срезы.
Распаковка списков
Раньше мы уже встречались с такой конструкцией как параллельное присваивание
Step25:  Кроме того, можно распаковывать списки прямо в цикле for
Step26:  Другие операции
Также для списков есть набор многих других удобных функций, уже встроенных в Python. 
Минимум
Функция min ищет минимальный элемент списка
Step27:  Сумма
Функция sum считает сумму всех чисел списка
Step28:  Индекс элемента
Метод index находит индекс элемента в списке
Step29:  ValueError
Step30:  Вставка элемента
Метод insert(index, element) вставляет элемент element на место index, остальные элементы сдвигаются.
Step31:  Переворачивание списка
Метод reverse переворачивает список
<ASSISTANT_TASK:>
Python Code:
a = [1, 2, "Hi"]         # Создать список и присвоить переменной `а` этот список
print(a[0], a[1], a[2])  # Обращение к элементам списка, индексация с нуля
b = list()               # Создать пустой список
c = []                   # Другой способ создать пустой список
Explanation: <h1>Содержание<span class="tocSkip"></span></h1>
<div class="toc"><ul class="toc-item"><li><span><a href="#Базовые-операции" data-toc-modified-id="Базовые-операции-1">Базовые операции</a></span><ul class="toc-item"><li><span><a href="#Создание-списка" data-toc-modified-id="Создание-списка-1.1">Создание списка</a></span></li><li><span><a href="#Доступ-к-элементам" data-toc-modified-id="Доступ-к-элементам-1.2">Доступ к элементам</a></span></li><li><span><a href="#Добавление-элемента-в-конец" data-toc-modified-id="Добавление-элемента-в-конец-1.3">Добавление элемента в конец</a></span></li><li><span><a href="#Длина-списка" data-toc-modified-id="Длина-списка-1.4">Длина списка</a></span></li><li><span><a href="#Сортировка" data-toc-modified-id="Сортировка-1.5">Сортировка</a></span></li><li><span><a href="#Сложение" data-toc-modified-id="Сложение-1.6">Сложение</a></span></li><li><span><a href="#Особенности-присваивания-списков" data-toc-modified-id="Особенности-присваивания-списков-1.7">Особенности присваивания списков</a></span></li></ul></li><li><span><a href="#Списки-и-if" data-toc-modified-id="Списки-и-if-2">Списки и if</a></span><ul class="toc-item"><li><span><a href="#Преобразование-к-логическому-значению" data-toc-modified-id="Преобразование-к-логическому-значению-2.1">Преобразование к логическому значению</a></span></li><li><span><a href="#Проверка-наличия-элемента-в-списке" data-toc-modified-id="Проверка-наличия-элемента-в-списке-2.2">Проверка наличия элемента в списке</a></span></li></ul></li><li><span><a href="#Списки-и-for" data-toc-modified-id="Списки-и-for-3">Списки и for</a></span></li><li><span><a href="#Списки-и-строки" data-toc-modified-id="Списки-и-строки-4">Списки и строки</a></span><ul class="toc-item"><li><span><a href="#Split-—-разбиение-строки" data-toc-modified-id="Split-—-разбиение-строки-4.1">Split — разбиение строки</a></span></li><li><span><a href="#Join-—-объединение-строк" data-toc-modified-id="Join-—-объединение-строк-4.2">Join — объединение строк</a></span></li><li><span><a href="#Изменение-символа-строки" data-toc-modified-id="Изменение-символа-строки-4.3">Изменение символа строки</a></span></li></ul></li><li><span><a href="#Распаковка-списков" data-toc-modified-id="Распаковка-списков-5">Распаковка списков</a></span></li><li><span><a href="#Другие-операции" data-toc-modified-id="Другие-операции-6">Другие операции</a></span><ul class="toc-item"><li><span><a href="#Минимум" data-toc-modified-id="Минимум-6.1">Минимум</a></span></li><li><span><a href="#Сумма" data-toc-modified-id="Сумма-6.2">Сумма</a></span></li><li><span><a href="#Индекс-элемента" data-toc-modified-id="Индекс-элемента-6.3">Индекс элемента</a></span></li><li><span><a href="#Удаление-элемента" data-toc-modified-id="Удаление-элемента-6.4">Удаление элемента</a></span></li><li><span><a href="#Вставка-элемента" data-toc-modified-id="Вставка-элемента-6.5">Вставка элемента</a></span></li><li><span><a href="#Переворачивание-списка" data-toc-modified-id="Переворачивание-списка-6.6">Переворачивание списка</a></span></li></ul></li></ul></div>
Списки
Списки (list) — это некоторое подобие массива в "привычных" вам языках программирования лишь с тем отличием, что в list могут храниться элементы разных типов. Давайте попробуем разобраться на примерах.
Базовые операции
Создание списка
End of explanation
a = [0] * 10
print(a)
N = 5
b = [True] * N
print(b)
Explanation: Можно создать список из однотипных элементов заданной длины:
End of explanation
a = [1, 2, "Hi"] 
a[1] = 4  # Изменить отдельный элемент списка
print(a)  # Вывести весь список
Explanation: Доступ к элементам
End of explanation
a = [1, 2, "Hi"]
print(a[-1], '=', a[2])
print(a[-2], '=', a[1])
print(a[-3], '=', a[0])
b = ["a", 1, -2, [1, 2, 3], "b", 3.4]  # Элементом списка может быть список
print(b[-3])
Explanation: Обратите внимание, что при выведении списка таким способом он выводится с квадратными скобками и запятыми.
В Python есть отрицательная индексация. −1 элемент это последний элемент, −2 элемент это предпоследний элемент списка и так далее:
End of explanation
a = [2, 3]
a.append(5)
print(a)
Explanation: Добавление элемента в конец
Метод append добавляет новый элемент в конец существующего списка:
End of explanation
a = [1, 3, 6]
print(len(a))
Explanation: Длина списка
Функция len позволяет узнать длину (размер) списка:
End of explanation
a = [3, 2, 4, 1, 2]
a.sort()
print(a)
Explanation: Сортировка
Метод sort сортирует текущий список по невозрастанию, если это возможно:
End of explanation
a = [1, 2, 3]
b = [4, 5, 6]
c = a + b
print(c)
Explanation: Сложение
Списки можно складывать друг с другом. При этом создаётся новый список, в котором сначала идут элементы одного списка, затем другого.
End of explanation
a = [1, 2, 3, 4]  # а - ссылка на список, каждый элемент списка это ссылки на объекты 1, 2, 3, 4
b = a             # b - ссылка на тот же самый список
# В Python у каждого объекта есть свой id (идентификатор) -
# некоторое уникальное число, сопоставленное объекту
print("id(a) = ", id(a))
print("id(b) = ", id(b))
a[0] = -1        # Меняем элемент списка a
print("b =", b)  # Значение b тоже поменялось!
Explanation: Особенности присваивания списков
Во время выполнения интерпретатор хранит все данные, которые у вас есть в программе, как некоторый набор объектов. Примеры объектов:
42 — число 42
"abc" — строка «abc»
"42" — строка «42»
3.0 — вещественное число 3.0
False — логическое значение «Ложь»
["abc", "42", 42] — список из нескольких других объектов
Переменная — это всего лишь ссылка на объект, который хранит интепретатор.
С учётом ссылочного устройства, посмотрим как происходит присваивание одного списка другому:
End of explanation
a = 2
b = a
print("a =", a, ", id(a) =", id(a))
print("b =", b, ", id(b) =", id(b))
print()
a = 3
print("a =", a, ", id(a) =", id(a))
print("b =", b, ", id(b) =", id(b))
Explanation: Чтобы узнать как скопировать список, читайте страницу про срезы.
Почему то же самое не происходит с другими типами, например числами? Рассматривайте каждое отдельное число тоже как отдельный объект, на который может вести ссылка. Например, 2 это объект, и 3 это объект. При изменении значения переменной меняется только ссылка, а не объект.
End of explanation
lst = []
if lst:
    print("Ветка if")
else:
    print("Ветка else")
lst = []
if not lst:
     print("Ветка if")
else:
    print("Ветка else")
Explanation: Списки и if
Преобразование к логическому значению
Пустой список преобразуется к логическому значению False:
End of explanation
lst = [2, 3, 4]
if lst:
    print("Ветка if")
else:
    print("Ветка else")
lst = [[]]
if lst:
    print("Ветка if")
else:
    print("Ветка else")
Explanation: Непустой список преобразуется к True:
End of explanation
lst = [1, 6, 29, 4, "a", 3, -1]
if 3 in lst:
    print("3 is in the list")
else:
    print("3 is not in the list")
Explanation: Проверка наличия элемента в списке
Проверить, есть ли элемент в списке, можно с помощью оператора in. Это то же самое, что и пройти по всему списку и для каждого элемента проверить, не равен ли он искомому.
End of explanation
lst = [1, 6, 29, 4, "a", 3, -1]
if 5 not in lst:
    print("5 is not in the list")
Explanation: Также есть аналогичный оператор not in, который проверяет, что элемента нет в списке:
End of explanation
for i in [2, 3, 5, 7]:
    print(i)
lst = [3, "ads", [1, 2]]
for i in lst:
    print(i)
Explanation: Списки и for
Есть специальный синтаксис цикла for, который позволяет пройтись по каждому элементу списка. В этом случае переменной присваивается не индекс элемента, а именно значение:
End of explanation
r = range(5)
print(r[2], r[-1])
Explanation: В каком-то смысле range тоже похож на list:
End of explanation
s = "1#2#3"
print(s.split("#"))
Explanation: Списки и строки
Split — разбиение строки
Метод split разбивает строку на список строк по выбранному разделяющему символу или нескольким символам. Например для разбивания строки по символу #:
End of explanation
names = "Artem    Irina  Zhenya"
print(names.split())
Explanation: По умолчанию (без параметров) split разбивает строку по пробельным символам, игнорируя подряд идущие пробельные символы:
End of explanation
s = "1abc2abcd3"
print(s.split("abc"))
Explanation: Пример строки-разделителя более чем из одной буквы:
End of explanation
lst = ["1", "2", "3"]
print("#".join(lst))
Explanation: Join — объединение строк
Метод join возвращает строку, в которой все элементы списка записаны через разделительный символ (символы). Каждый элемент списка обязательно должен быть строкой.
End of explanation
print("".join(["1", "2", "3"]))
Explanation: Разделительная строка может быть пустой:
End of explanation
shopping_list = ', '.join(['apples', 'milk', 'flour', 'jam'])
print(shopping_list)
Explanation: Обратите внимание, что разделитель ставится только между строками, и никогда в конце.
Разделитель из нескольких символов:
End of explanation
shopping_list = '\n'.join(['apples', 'milk', 'flour', 'jam'])
print(shopping_list)
Explanation: Разделитель в виде перевода строки:
End of explanation
a = "long string"  # у нас есть строка, мы хотим уметь ее изменять
print(a)
l = list(a)        # сделаем из строки список символов
print(l)
l[2] = "!"         # изменим один элемент списка
print(l)
s = "".join(l)
print(s)
Explanation: Изменение символа строки
Строки являются неизменяемым типом, но достаточно часто встречается ситуация, когда нам нужно изменить один символ в строке. В таких случаях:
Преобразуют строку к списку и получают список символов (строк, состоящих из одного символа)
Изменяют один элемент списка
Список строк склеивают в одну большую строку
Пример:
End of explanation
a, b, c = [2, "abs", 3]  # Присваиваем в явном виде заданный список
print(a, b, c)
lst = [2, "abs", 3]
a, b, c = lst  # Чуть менее тривиальная запись того же самого
print(a, b, c)
Explanation: Также существует другой способ изменить третий символ строки, используя срезы.
Распаковка списков
Раньше мы уже встречались с такой конструкцией как параллельное присваивание:
a, b = c, d
Давайте ее немного обобщим. Если мы вместо двух значений c и d поставим один список, содержащий столько же элементов, сколько и переменных в левой части равенства, то Python проделает аналогичное параллельное присваивание.
End of explanation
lst = [[1, 1], [2, 4], [3, 9], [4, 16]]
for a, b in lst:
    print(a, b)
print()
# То же самое в более привычной форме
for x in lst:
    a, b = x
    print(a, b)
Explanation: Кроме того, можно распаковывать списки прямо в цикле for:
End of explanation
l = [1, 2, -1, 3, 2, -2, 1, 5, 7, 3]
print(min(l))
# min можно брать и от двух элементов вместо списка
print(min(12, 10))
Explanation: Другие операции
Также для списков есть набор многих других удобных функций, уже встроенных в Python. 
Минимум
Функция min ищет минимальный элемент списка:
End of explanation
print(sum([2, 3, 11, 1]))
Explanation: Сумма
Функция sum считает сумму всех чисел списка:
End of explanation
l = [1, 2, -1, 3, 2, -2, 1, 5, 7, 3]
print(l.index(3))  # В списке l у нас две тройки и index возвращает индекс первой из них
l = [1, 2, -1, 3, 2, -2, 1, 5, 7, 3]
print(l.index(115))  # Если элемента нет в списке, то произойдет ошибка выполнения
Explanation: Индекс элемента
Метод index находит индекс элемента в списке:
End of explanation
l = [1, 2, 3]
last_element = l.pop()
print(l)
print(last_element)
Explanation: ValueError: 115 is not in list = ОшибкаЗначения: 115 не найдено в списке
Удаление элемента
Следующие методы изменяют именно текущий список, а не создают новый. Ни для одного из списков не поменяется id.
Метод pop удаляет и возращает последний элемент из списка:
End of explanation
l = [1, 2, 4, 5]
l.insert(2, 3)
print(l)
Explanation: Вставка элемента
Метод insert(index, element) вставляет элемент element на место index, остальные элементы сдвигаются.
End of explanation
a = [1, 4, 2, 5, 2]
a.reverse()
print(a)
Explanation: Переворачивание списка
Метод reverse переворачивает список:
End of explanation
<END_TASK>