Python 3
Содержание:
- Вопрос 11. Как работает функция range?
- Как работает Быстрая сортировка
- Функции листингов
- Python List Methods
- Как в Python работают представления списков?
- Списки
- Python list comprehensions
- 5. Как в Python работают представления списков?
- Начало работы с методами сортировки Pandas ↑
- Метод sort() и оператор ==
- Python counting list elements
- Методы списков
- Что такое список
- Проверяем наш связный список
Вопрос 11. Как работает функция range?
Сложность: (ー_ー)
Функция range() генерирует три разных вида последовательностей из целых чисел и часто используется для быстрого создания списков — поэтому этот вопрос и попал в нашу подборку. Да и объяснять работу функции удобнее всего именно с помощью списка.
Последовательность от нуля до n
Используется range(n):
Функция range(n) сгенерировала последовательность от нуля до n (исключая n), а мы эту последовательность двумя способами обернули в список. Первый способ вы уже узнали — это генератор списков, а второй использует функцию list, которая превращает подходящий аргумент в список.
Попробуйте передать в range() отрицательное (-7) или дробное (3.14) число. Получится ли какой-нибудь список из этого, и если да, то какой?
Последовательность от n до m
Здесь в функцию range() нужно передать уже два аргумента: тогда range(n, m) сгенерирует целые числа от n до m (исключая m):
Последовательность от n до m с шагом k
Если в функцию range() передать три аргумента n, m, k, то она снова создаст последовательность от n до m (снова исключая m), но уже с шагом k:
Как работает Быстрая сортировка
Быстрая сортировка чаще всего не сможет разделить массив на равные части. Это потому, что весь процесс зависит от того, как мы выбираем опорный элемент. Нам нужно выбрать опору так, чтобы она была примерно больше половины элементов и, следовательно, примерно меньше, чем другая половина элементов. Каким бы интуитивным ни казался этот процесс, это очень сложно сделать.
Подумайте об этом на мгновение — как бы вы выбрали адекватную опору для вашего массива? В истории быстрой сортировки было представлено много идей о том, как выбрать центральную точку — случайный выбор элемента, который не работает из-за того, что «дорогой» выбор случайного элемента не гарантирует хорошего выбора центральной точки; выбор элемента из середины; выбор медианы первого, среднего и последнего элемента; и еще более сложные рекурсивные формулы.
Самый простой подход — просто выбрать первый (или последний) элемент. По иронии судьбы, это приводит к быстрой сортировке на уже отсортированных (или почти отсортированных) массивах.
Именно так большинство людей выбирают реализацию быстрой сортировки, и, так как это просто и этот способ выбора опоры является очень эффективной операцией, и это именно то, что мы будем делать.
Теперь, когда мы выбрали опорный элемент — что нам с ним делать? Опять же, есть несколько способов сделать само разбиение. У нас будет «указатель» на нашу опору, указатель на «меньшие» элементы и указатель на «более крупные» элементы.
Цель состоит в том, чтобы переместить элементы так, чтобы все элементы, меньшие, чем опора, находились слева от него, а все более крупные элементы были справа от него. Меньшие и большие элементы не обязательно будут отсортированы, мы просто хотим, чтобы они находились на правильной стороне оси. Затем мы рекурсивно проходим левую и правую сторону оси.
Рассмотрим пошагово то, что мы планируем сделать, это поможет проиллюстрировать весь процесс. Пусть у нас будет следующий список.
29 | 99 (low),27,41,66,28,44,78,87,19,31,76,58,88,83,97,12,21,44 (high)
Выберем первый элемент как опору 29), а указатель на меньшие элементы (называемый «low») будет следующим элементом, указатель на более крупные элементы (называемый «high») станем последний элемент в списке.
29 | 99 (low),27,41,66,28,44,78,87,19,31,76,58,88,83,97,12,21 (high),44
Мы двигаемся в сторону high то есть влево, пока не найдем значение, которое ниже нашего опорного элемента.
29 | 99 (low),27,41,66,28,44,78,87,19,31,76,58,88,83,97,12,21 (high),44
- Теперь, когда наш элемент high указывает на элемент 21, то есть на значение меньше чем опорное значение, мы хотим найти значение в начале массива, с которым мы можем поменять его местами. Нет смысла менять местами значение, которое меньше, чем опорное значение, поэтому, если low указывает на меньший элемент, мы пытаемся найти тот, который будет больше.
- Мы перемещаем переменную low вправо, пока не найдем элемент больше, чем опорное значение. К счастью, low уже имеет значение 89.
- Мы меняем местами low и high:
29 | 21 (low),27,41,66,28,44,78,87,19,31,76,58,88,83,97,12,99 (high),44
- Сразу после этого мы перемещает high влево и low вправо (поскольку 21 и 89 теперь на своих местах)
- Опять же, мы двигаемся high влево, пока не достигнем значения, меньшего, чем опорное значение, и мы сразу находим — 12
- Теперь мы ищем значение больше, чем опорное значение, двигая low вправо, и находим такое значение 41
Этот процесс продолжается до тех пор, пока указатели low и high наконец не встретятся в одном элементе:
29 | 21,27,12,19,28 (low/high),44,78,87,66,31,76,58,88,83,97,41,99,44
Мы больше не используем это опорное значение, поэтому остается только поменять опорную точку и high, и мы закончили с этим рекурсивным шагом:
28,21,27,12,19,29,44,78,87,66,31,76,58,88,83,97,41,99,44
Как видите, мы достигли того, что все значения, меньшие 29, теперь слева от 29, а все значения больше 29 справа.
Затем алгоритм делает то же самое для коллекции 28,21,27,12,19 (левая сторона) и 44,78,87,66,31,76,58,88,83,97,41,99,44 (правая сторона). И так далее.
Функции листингов
Функции – это, пожалуй, главное преимущество Python над другими языками программирования. К спискам можно применять основные встроенные функции.
Рассмотрим наиболее популярные из них:
list(range( )) – если стоит задача создать последовательный список, то используется функция range. Эта функция имеет следующие формы:
- range(end). Применяется, когда необходимо создать листинг от нуля до конечного числа.
- range(start, end). Задается и начальное и конечное число.
- range(start, end, step). Параметром step задается характеристика выбора. Например, если нужно выбрать каждое пятое число из последовательности от 1 до 21, то полученный листинг будет иметь вид: .
Функция range способна значительно сократить объем кода.
- len(list) – позволяет узнать, сколько элементов в списке.
- sorted(list, ) – сортирует объекты списка по возрастанию.
- max(list) – возвращает наибольший элемент.
- min(list) – противоположная функция – позволяет вернуть элемент с минимальным значением.
Также можно использовать другие встроенные функции:
- list(tuple) – преобразует объект кортежа в список.
- sum(list) – суммирует все элементы в списке, если все значения являются числами, применяется как к целым числам, так и к десятичным дробям. Однако она справляется не всегда корректно. Если в списке есть нечисловой элемент, функция выдаст ошибку: «TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’».
Python List Methods
Methods that are available with list objects in Python programming are tabulated below.
They are accessed as . Some of the methods have already been used above.
| Python List Methods |
|---|
| append() — Add an element to the end of the list |
| extend() — Add all elements of a list to the another list |
| insert() — Insert an item at the defined index |
| remove() — Removes an item from the list |
| pop() — Removes and returns an element at the given index |
| clear() — Removes all items from the list |
| index() — Returns the index of the first matched item |
| count() — Returns the count of the number of items passed as an argument |
| sort() — Sort items in a list in ascending order |
| reverse() — Reverse the order of items in the list |
| copy() — Returns a shallow copy of the list |
Some examples of Python list methods:
Output
1 2
Как в Python работают представления списков?
Представление списков это, в сущности, просто элегантный способ конструирования списков в Python. Особенно этот способ понравится тем, кто любит математику. Судите сами:
Результат:
Итак, что же произошло? Мы взяли все целые числа от 0 до 10 (исключая 10) и каждое число возвели в квадрат.
Согласитесь, не очень сложно. Теперь давайте поднимем планку.
Давайте получим такой же список, но будем брать только четные числа, то есть те, которые нацело делятся на . Это также очень просто сделать при помощи представления списков.
Результат:
Мы просто добавили при помощи инструкции условие в наше первоначальное выражение. Если это условие выполняется, то число возводится в квадрат и добавляется в результирующий список, а если нет, то пропускается. В нашем случае это условие делимости на без остатка.
Итак, в более общем смысле, вы также можете использовать представление списков для преобразования ваших списков в другие списки, что звучит немного сложнее, не так ли?
Рассмотрим следующий пример:
Результат:
В данном примере у нас уже есть список , который мы преобразуем при помощи представления списков. Вы опять можете видеть, что выражение обеспечивает выполнение некоторых операций для всех элементов списка .
Теперь обратите внимание на выражение . Для простоты, вы должны просто знать, что лямбда-функции — это анонимные функции, которые создаются во время выполнения
Учитывая это, вы можете просто сосредоточиться на выражении .
Отсюда видно, что эта функция просто принимает один элемент и умножает его на самого себя, то есть возводит в квадрат. Это анонимная функция, поэтому вам нужно передать ей свой элемент списка, чтобы убедиться, что лямбда-функция принимает его в качестве входных данных. Поэтому мы видим такое выражение: .
Для лучшего понимания вторую строку кода можно переписать следующим образом:
Здесь мы просто определяем лямбда-функцию заранее.
Стоит отметить, что помимо представления списков существуют также представления словарей и представления множеств.
Списки
Списки Python схожи с массивами в других языках. В Python, пустой список может быть создан следующим образом:
Python
my_list = []
my_list = list()
|
1 2 |
my_list= my_list=list() |
Как вы видите, вы можете создать список при помощи квадратных скобок, или при помощи встроенного инструмента Python – list. Список состоит из таких элементов, как строки, цифры, объекты и смеси типов. Давайте взглянем на несколько примеров:
Python
my_list =
my_list2 =
my_list3 =
|
1 2 3 |
my_list=1,2,3 my_list2=»a»,»b»,»c» my_list3=»a»,1,»Python»,5 |
Первый список содержит 3 числа, второй 3 строки, третий содержит смесь. Вы также можете создавать списки списков, вот так:
Python
my_nested_list =
print(my_nested_list) # , ]
|
1 2 |
my_nested_list=my_list,my_list2 print(my_nested_list)# , ] |
В какой-то момент вам может понадобиться скомбинировать два списка вместе. Первый способ сделать это – при помощи метода extend:
Python
combo_list =
one_list =
a = combo_list.extend(one_list)
print(a) #
|
1 2 3 4 5 |
combo_list=1 one_list=4,5 a=combo_list.extend(one_list) print(a)# |
Немного проще будет просто добавить два списка вместе.
Python
my_list =
my_list2 =
combo_list = my_list + my_list2
print(combo_list) #
|
1 2 3 4 5 |
my_list=1,2,3 my_list2=»a»,»b»,»c» combo_list=my_list+my_list2 print(combo_list)# |
Да, это именно настолько просто. Вы также можете сортировать список. Давайте уделим немного времени и взглянем на то, как это делается:
Python
alpha_list =
alpha_list.sort()
print(alpha_list) #
|
1 2 3 4 |
alpha_list=34,23,67,100,88,2 alpha_list.sort() print(alpha_list)# |
Получилось. Видите? Давайте взглянем на еще один пример, чтобы закрепить результат:
Python
alpha_list =
sorted_list = alpha_list.sort()
print(sorted_list) # None
|
1 2 3 4 |
alpha_list=34,23,67,100,88,2 sorted_list=alpha_list.sort() print(sorted_list)# None |
В этом примере мы попытались назначить сортированный список переменной. Однако, когда вы вызываете метод sort() в списке, он сортирует список на месте. Так что если вы попробуете назначить результат другой переменной, тогда возникнет объект None, который аналогичен объекту Null в других языках. Таким образом, когда вам нужно отсортировать что-нибудь, просто помните, что вы сортируете на месте, и вы не можете назначить объект другой переменной.Вы можете разрезать список также, как вы делаете это со строкой:
Python
a = alpha_list
print(a) #
|
1 2 |
a=alpha_list3 print(a)# |
Данный код выдает список из трех первых элементов.
Python list comprehensions
A list comprehension is a syntactic construct which
creates a list based on existing list. The syntax was influenced
by mathematical notation of sets. The Python
syntax was inspired by the Haskell programming language.
L = ]
The above pseudo code shows the syntax of a list comprehension. A list
comprehension creates a new list. It is based on an existing list. A for
loop goes through the sequence. For each loop an expression is evaluated
if the condition is met. If the value is computed it is appended to the new list.
The condition is optional.
List comprehensions provide a more concise way to create lists in situations
where and and/or nested loops could be used.
list_comprehension.py
#!/usr/bin/env python # list_comprehension.py a = b = print(b)
In the example we have defined a list of numbers.
With the help of the list comprehension, we create a new list
of numbers that cannot be divided by 2 without a remainder.
a =
This is the list of nine integers.
b =
Here we have the list comprehension. In the loop
each element of a list is taken. Then a condition
is tested. If the condition is met, an expression is evaluated. In our
case the expression is a pure which takes the element as
it is. Finally, the element is appended to the list.
$ ./list_comprehension.py
Example output. The numbers in a list cannot be divided by 2, without a
remainder.
In the second example we compare a list comprehension to a traditional
for loop.
list_comprehension2.py
#!/usr/bin/env python
# list_comprehension2.py
lang = "Python"
a = []
for e in lang:
a.append(ord(e))
b =
print(a)
print(b)
In the example we have a string. We want to create a
list of the ASCII integer codes of the letters of the string.
a = []
for e in lang:
a.append(ord(e))
We create such a list with the for loop.
b =
Here the same is produced using a list comprehension.
Note that the if condition was omitted. It is optional.
$ ./list_comprehension2.py
This is example output. You can find out more about list comprehensions
in Python list comprehensions
tutorial.
5. Как в Python работают представления списков?
Представление списков это, в сущности, просто элегантный способ конструирования списков в Python. Особенно этот способ понравится тем, кто любит математику. Судите сами:
Результат:
Итак, что же произошло? Мы взяли все целые числа от 0 до 10 (исключая 10) и каждое число возвели в квадрат.
Согласитесь, не очень сложно. Теперь давайте поднимем планку.
Давайте получим такой же список, но будем брать только четные числа, то есть те, которые нацело делятся на . Это также очень просто сделать при помощи представления списков.
Результат:
Мы просто добавили при помощи инструкции условие в наше первоначальное выражение. Если это условие выполняется, то число возводится в квадрат и добавляется в результирующий список, а если нет, то пропускается. В нашем случае это условие делимости на без остатка.
Итак, в более общем смысле, вы также можете использовать представление списков для преобразования ваших списков в другие списки, что звучит немного сложнее, не так ли?
Рассмотрим следующий пример:
Результат:
В данном примере у нас уже есть список , который мы преобразуем при помощи представления списков. Вы опять можете видеть, что выражение обеспечивает выполнение некоторых операций для всех элементов списка .
Теперь обратите внимание на выражение. Для простоты, вы должны просто знать, что лямбда-функции — это анонимные функции, которые создаются во время выполнения
Учитывая это, вы можете просто сосредоточиться на выражении .
Отсюда видно, что эта функция просто принимает один элемент и умножает его на самого себя, то есть возводит в квадрат. Это анонимная функция, поэтому вам нужно передать ей свой элемент списка, чтобы убедиться, что лямбда-функция принимает его в качестве входных данных. Поэтому мы видим такое выражение: .
Для лучшего понимания вторую строку кода можно переписать следующим образом:
Здесь мы просто определяем лямбда-функцию заранее.
Стоит отметить, что помимо представления списков существуют также представления словарей и представления множеств.
Начало работы с методами сортировки Pandas ↑
Напоминаем, что DataFrame — это структура данных с помеченными осями для строк и столбцов. Вы можете отсортировать DataFrame по значению строки или столбца, а также по индексу строки или столбца.
И строки, и столбцы имеют индексы, которые представляют собой числовые представления о том, где находятся данные в вашем DataFrame. Вы можете получать данные из определенных строк или столбцов, используя расположение индекса DataFrame. По умолчанию номера индексов начинаются с нуля. Вы также можете вручную назначить собственный индекс.
Подготовка набора данных
В этом уроке будем работать с данными об экономии топлива, собранными Агентством по охране окружающей среды США (EPA) на транспортных средствах, выпущенных в период с 1984 по 2021 год. Набор данных EPA по экономии топлива великолепен, потому что он содержит много различных типов информации, которую вы можете отсортировать, включая текстовую и числовою информацию. Набор данных содержит всего восемьдесят три колонки.
Чтобы продолжить, вам понадобится установленная библиотека Python pandas. Код в этом руководстве был выполнен с использованием pandas 1.2.0 и Python 3.9.1.
Для анализа будем просматривать данные о MPG (миля на галлон) для транспортных средств по маркам, моделям, годам и другим характеристикам транспортных средств. Можно указать, какие столбцы следует читать в DataFrame. Для этого урока вам понадобится только часть доступных столбцов. Вот команды для чтения соответствующих столбцов набора данных по экономии топлива в DataFrame и для отображения первых пяти строк:
>>> import pandas as pd >>> column_subset = >>> df = pd.read_csv( ... "https://www.fueleconomy.gov/feg/epadata/vehicles.csv", ... usecols=column_subset, ... nrows=100 ... ) >>> df.head() city08 cylinders fuelType ... mpgData trany year 0 19 4 Regular ... Y Manual 5-spd 1985 1 9 12 Regular ... N Manual 5-spd 1985 2 23 4 Regular ... Y Manual 5-spd 1985 3 10 8 Regular ... N Automatic 3-spd 1985 4 17 4 Premium ... N Manual 5-spd 1993
Вызывая с URL-адресом набора данных, вы можете загрузить данные в DataFrame. Сокращение количества столбцов приводит к более быстрой загрузке и меньшему использованию памяти. Чтобы еще больше ограничить потребление памяти и быстро почувствовать данные, вы можете указать, сколько строк загружать, используя .
Знакомство с .sort_values()
Для сортировки значений в DataFrame по любой оси (столбцы или строки) используем . Как правило, требуется отсортировать строки в DataFrame по значениям одного или нескольких столбцов:
На рисунке выше показаны результаты использования для сортировки строк DataFrame на основе значений в столбце . Это похоже на то, как вы сортируете данные в электронной таблице с помощью столбца.
Знакомство с .sort_index()
используем для сортировки DataFrame по индексу строки или меткам столбцов. Отличие от заключается в том, что вы сортируете DataFrame на основе индекса строки или имени столбцов, а не значений в этих строках или столбцах:
Индекс строки DataFrame обведен синим на рисунке выше. Индекс не считается столбцом, и обычно у вас есть только один индекс строки. Индекс строки можно рассматривать как номера строк, которые начинаются с нуля.
Метод sort() и оператор ==
Для сравнения двух списков можно использовать метод sort() вместе с оператором ==. Метод sort() используется для сортировки таким образом, чтобы элементы в двух списках находились на одинаковых позициях.
Примечание: порядок элементов не влияет на результат, поскольку мы будем сортировать списки перед сравнением.
Оператор == используется для сравнения списков элемент за элементом.
Пример
import collections
l1 =
l2 =
l3 =
l1.sort()
l2.sort()
l3.sort()
if l1 == l3:
print ("Списки l1 и l3 одинаковые")
else:
print ("Списки l1 и l3 неодинаковые")
if l1 == l2:
print ("Списки l1 и l2 одинаковые")
else:
print ("Списки l1 и l2 неодинаковые")
Вывод
Списки l1 и l3 одинаковые Списки l1 и l2 неодинаковые
Python counting list elements
Sometimes it is important to count list elements. For this,
Python has the method.
counting.py
#!/usr/bin/env python # counting.py n = print(n.count(4)) print(n.count(1)) print(n.count(2)) print(n.count(6))
In this example, we count the number of occurrences of a few numbers
in the list.
n =
We have a list of integer numbers. Integers 1 and 4 are present multiple times.
print(n.count(4)) print(n.count(1)) print(n.count(2)) print(n.count(6))
Using the method, we find out the occurrence
of 4, 1, 2, and 6 numbers.
$ ./counting.py 3 2 1 0
Number 4 is present 3 times, 1 twice, 2 once, and 6 is not
present in the list.
Методы списков
len()
Метод возвращает длину объекта (списка, строки, кортежа или словаря).
принимает один аргумент, который может быть или последовательностью (например, строка, байты, кортеж, список, диапазон), или коллекцией (например, словарь, множество, frozenset).
list1 = # список
print(len(list1)) # в списке 3 элемента, в выводе команды будет "3"
str1 = 'basketball' # строка
print(len(str1)) # в строке 9 букв, в выводе команды будет "9"
tuple1 = (2, 3, 4, 5) # кортеж
print(len(tuple1)) # в кортеже 4 элемента, в выводе команды будет "4"
dict1 = {'name': 'John', 'age': 4, 'score': 45} # словарь
print(len(dict1)) # в словаре 3 пары ключ-значение, в выводе команды будет "3"
index()
возвращает индекс элемента. Сам элемент передается методу в качестве аргумента. Возвращается индекс первого вхождения этого элемента (т. е., если в списке два одинаковых элемента, вернется индекс первого).
numbers =
words =
print(numbers.index(9)) # 4
print(numbers.index(2)) # 1
print(words.index("I")) # 0
print(words.index("JavaScript")) # возвращает ValueError, поскольку 'JavaScript' в списке 'words' нет
Первый результат очевиден. Второй и
третий output демонстрируют возврат индекса
именно первого вхождения.
Цифра «2» встречается в списке дважды,
первое ее вхождение имеет индекс 1,
второе — 2. Метод index() возвращает индекс
1.
Аналогично возвращается индекс 0 для элемента «I».
Если элемент, переданный в качестве аргумента, вообще не встречается в списке, вернется ValueError. Так получилось с попыткой выяснить индекс «JavaScript» в списке .
Опциональные аргументы
Чтобы ограничить поиск элемента
конкретной подпоследовательностью,
можно использовать опциональные
аргументы.
words =
print(words.index("am", 2, 5)) # 4
Метод index() будет искать элемент «am» в диапазоне от элемента с индексом 2 (включительно) до элемента с индексом 5 (этот последний элемент не входит в диапазон).
При этом возвращаемый индекс — индекс
элемента в целом списке, а не в указанном
диапазоне.
pop()
Метод удаляет и возвращает последний элемент списка.
Этому методу можно передавать в качестве параметра индекс элемента, который вы хотите удалить (это опционально). Если конкретный индекс не указан, метод удаляет и возвращает последний элемент списка.
Если в списке нет указанного вами индекса, метод выбросит exception .
cities = print "City popped is: ", cities.pop() # City popped is: San Francisco print "City at index 2 is : ", cities.pop(2) # City at index 2 is: San Antonio
Базовый функционал стека
Для реализации базового функционала
стека в программах на Python часто
используется связка метода pop() и метода
append():
stack = []
for i in range(5):
stack.append(i)
while len(stack):
print(stack.pop())
Что такое список
Его можно сравнить со списком покупок для магазина: точно так же вносятся элементы, их тоже можно добавлять и корректировать.
Как списки хранятся в памяти?
Базовая C-структура списков в Python (CPython) выглядит следующим образом:
Когда мы создаём список, в памяти под него резервируется объект, состоящий из 3-х частей:
- – заголовок;
- – массив указателей на элементы списка;
- – количество выделенной памяти под элементы списка;
Объект списка хранит указатели на объекты, а не на сами объекты
Python размещает элементы списка в памяти, затем размещает указатели на эти элементы. Таким образом, список в Python – это массив указателей.
Список в Python – это массив указателей на элементы, размещенные в памяти
Проверяем наш связный список
Давайте все это проверим. Начнем с создания нового объекта Node. Назовем его (две латинские буквы «l» в нижнем регистре как сокращение Linked List). Назначим ему значение 1.
Поскольку мы написали такой классный метод , мы можем вызывать его для добавления в наш список новых узлов.
Как нам увидеть, как выглядит наш список? Теоретически, выглядеть он должен следующим образом:
Но нет способа вывести его именно в таком виде. Нам нужно пройти список, выводя каждое значение. Вы же помните, как проходить список? Мы только что это делали. Повторим:
- Создаем переменную, указывающую на .
- Если есть следующий узел, перемещаемся к этому узлу.
И просто выводим в каждом узле. Мы начинаем с шага № 1: создаем новую переменную и назначаем ее головным элементом списка.
Далее мы выводим первый узел. Почему мы не начали с цикла while? Цикл while проитерируется только дважды, потому что только у двух узлов есть (у последнего узла его нет). В информатике это называется ошибкой на единицу (когда нужно сделать что-то Х раз плюс 1). Это можно представить в виде забора. Вы ставите столб, затем секцию забора, и чередуете пару столько раз, сколько нужно по длине.
Но вы не можете оставить последнюю секцию забора висящей в воздухе. Ограда должна закончиться столбом, а не секцией. Поэтому вам приходится либо добавлять еще один столб в конце, либо (что в информатике более распространено) начать с постановки столба, а затем добавлять пары . Это мы и сделаем.
Для начала мы выведем первый узел, а затем запустим цикл while для вывода всех последующих узлов.
node = ll
print(node.data)
while node.next:
node = node.next
print(node.data)
Запустив это для нашего предыдущего списка, мы получим в консоли:
Ура! Наш связный список работает.

