Аннотация. Урок посвящен вложенным спискам, то есть спискам, входящим в качестве элементов в другие списки.
Как мы уже знаем, список представляет собой упорядоченную последовательность элементов, индексы которых пронумерованы от 00. Элементами списка могут быть любые типы данных – числа, строки, булевы значения и т.д. Например,
numbers = [10, 3]
constants = [3.1415, 2.71828, 1.1415]
countries = ['Russia', 'Armenia', 'Argentina']
flags = [True, False]
Список numbers состоит из 22-х элементов, и каждый из них — целое число:
numbers[0] == 10;numbers[1] == 3.Список constants состоит из 33-х элементов, каждый из которых — вещественное число:
constants[0] == 3.1415;constants[1] == 2.71828;constants[2] == 1.1415.Список countries состоит из 33-х элементов, каждый из которых — строка:
countries[0] == 'Russia';countries[1] == 'Armenia';countries[2] == 'Argentina'.Список flags состоит из 22-х элементов, и каждый из них — булево значение:
flags[0] == True;flags[1] == False.Мы также говорили, что элементы списка не обязательно должны иметь одинаковый тип данных. Список может содержать значения разных типов данных:
info = ['Timur', 1992, 72.5]
Список info содержит строковое значение, целое число и число с плавающей точкой:
info[0] == 'Timur';info[1] == 1992;info[2] == 72.5.Обычно элементы списка содержат данные одного типа, и на практике редко приходится создавать списки, содержащие элементы разных типов данных.
Оказывается, элементами списков могут быть другие списки и в реальной разработке такая конструкция оказывается очень полезной. Такие списки называются вложенными списками.
Работа с вложенными списками принципиально ничем не отличается от работы со списками, например, чисел или строк. Чтобы создать вложенный список, мы также перечисляем элементы через запятую в квадратных скобках:
my_list = [[0], [1, 2], [3, 4, 5]]
Переменная my_list ссылается на список, состоящий из других списков (с вложенными списками).
Поскольку глубина вложенности списка my_list равна двум, то такой список обычно называют двумерным списком. На практике, как правило, мы работаем с двумерными списками, реже – с трехмерными.
Рассмотрим программный код:
my_list = [[0], [1, 2], [3, 4, 5]]
print(my_list)
print(my_list[0])
print(my_list[1])
print(my_list[2])
print(len(my_list))
Результатом работы такого кода будет:
[[0], [1, 2], [3, 4, 5]]
[0]
[1, 2]
[3, 4, 5]
3
Давайте взглянем на каждую строку приведенного кода поближе.
my_list. Список имеет три элемента, и каждый элемент тоже является списком:
my_list[0] является список [0];my_list[1] является список [1, 2];my_list[2] является список [3, 4, 5].my_list;my_list[0];my_list[1];my_list[2];my_list, то есть число 33.При работе с одномерными списками мы использовали индексацию, то есть обращение к конкретному элементу по его индексу. Аналогично можно индексировать и вложенные списки:
my_list = ['Python', [10, 20, 30], ['Beegeek', 'Stepik']]
print(my_list[0])
print(my_list[1])
print(my_list[2])
Результатом работы такого кода будет:
Python
[10, 20, 30]
['Beegeek', 'Stepik']
Так как элементы списка my_list – строка и списки, их также можно индексировать.
Рассмотрим программный код:
my_list = ['Python', [10, 20, 30], ['Beegeek', 'Stepik!']]
print(my_list[0][2]) # индексирование строки 'Python'
print(my_list[1][1]) # индексирование списка [10, 20, 30]
print(my_list[2][-1]) # индексирование списка ['Beegeek', 'Stepik!']
print(my_list[2][-1][-1]) # индексирование строки 'Stepik!'
Результатом работы такого кода будет:
t
20
Stepik!
!
Попытка обратиться к элементу списка по несуществующему индексу:
print(my_list[3]) # у списка my_list индексы от 0 до 2
вызовет ошибку:
IndexError: index out of range
В прошлом курсе мы рассматривали встроенные функции max(), min(), len(), полезные и при работе с вложенными списками (обработке вложенных списков).
Рассмотрим программный код:
my_list = [[0], [1, 2], [3, 4, 5], [], [10, 20, 30]]
print(len(my_list))
Результатом работы такого кода будет:
5
Обратите внимание, встроенная функция len() возвращает количество элементов (число 55) списка my_list, а не общее количество элементов во всех списках (число 99).
Если требуется посчитать общее количество элементов во вложенном списке my_list, мы можем использовать цикл for в связке с функцией len():
total = 0
my_list = [[0], [1, 2], [3, 4, 5], [], [10, 20, 30]]
for li in my_list:
total += len(li)
print(total)
Результатом работы такого кода будет:
9
Переменная li последовательно принимает все значения элементов списка my_list, то есть является сама по себе списком, поэтому мы можем вызывать функцию len() с переданным аргументом li.
Функции min() и max() могут работать и со списками. Если этим функциям передается несколько списков, то целиком возвращается один из переданных списков. При этом сравнение происходит поэлементно: сначала сравниваются первые элементы списков. Если они не равны, то функция min() вернет тот список, первый элемент которого меньше, max() – наоборот. Если первые элементы равны, то будут сравниваться вторые и т. д.
Рассмотрим программный код:
list1 = [1, 7, 12, 0, 9, 100]
list2 = [1, 7, 90]
list3 = [1, 10]
print(min(list1, list2, list3))
print(max(list1, list2, list3))
Результатом работы такого кода будет:
[1, 7, 12, 0, 9, 100]
[1, 10]
Функции min() и max() также можно использовать при работе с вложенными списками. Рассмотрим программный код:
list1 = [[1, 7, 12, 0, 9, 100], [1, 7, 90], [1, 10]]
list2 = [['a', 'b'], ['a'], ['d', 'p', 'q']]
print(min(list1))
print(max(list1))
print(min(list2))
print(max(list2))
Результатом работы такого кода будет:
[1, 7, 12, 0, 9, 100]
[1, 10]
['a']
['d', 'p', 'q']
Обратите внимание – элементы вложенных списков в этой ситуации должны быть сравнимы.
Таким образом, следующий код:
my_list = [[1, 7, 12, 0, 9, 100], ['a', 'b']]
print(min(my_list))
print(max(my_list))
приведет к возникновению ошибки:
TypeError: '<' not supported between instances of 'str' and 'int'
Примечание 1. Независимо от вложенности списков, нам нужно помнить по возможности все списочные методы:
метод append() добавляет новый элемент в конец списка;
метод extend() расширяет один список другим списком;
метод insert() вставляет значение в список в заданной позиции;
метод index() возвращает индекс первого элемента, значение которого равняется переданному в метод значению;
метод remove() удаляет первый элемент, значение которого равняется переданному в метод значению;
метод pop() удаляет элемент по указанному индексу и возвращает его;
метод count() возвращает количество элементов в списке, значения которых равны переданному в метод значению;
метод reverse() инвертирует порядок следования значений в списке, то есть меняет его на противоположный;
метод copy() создает поверхностную копию списка.;
метод clear() удаляет все элементы из списка;
оператор del позволяет удалять элементы списка по определенному индексу.
Примечание 2. Методы строк, работающие со списками:
split() разбивает строку на слова, используя в качестве разделителя последовательность пробельных символов, символ табуляции (\t) или символ новой строки (\n).join() собирает строку из элементов списка, используя в качестве разделителя строку, к которой применяется метод.Примечание 3. Язык Python не ограничивает нас в уровнях вложенности: элементами списка могут быть списки, их элементами могут быть другие списки, элементами которых в свою очередь могут быть другие списки...