Включите исполнение JavaScript в браузере, чтобы запустить приложение.
15 ноя 2024

Что такое вложенные списки в Python и как с ними работать

Откройте для себя возможности вложенных списков в Python. Научитесь создавать и манипулировать этими многоуровневыми коллекциями, чтобы эффективно хранить и обрабатывать многомерные данные. Подробнее читайте на сайте.

Расскажем о том, как работают иерархические структуры данных в Python и для чего они используются на практике.

Что такое вложенные списки?

Так называются списки, составляющие которых также являются отдельными списками. Представим себе построение древовидной структуры, где у каждого узла могут быть свои «ветви» — так называемые дочерние узлы. В Python вложенные списки работают по такому же принципу: внутри основного перечня могут быть дочерние, которые, в свою очередь, могут содержать в себе аналогичные структуры следующего уровня. 

Таким образом можно организовать информацию в иерархической структуре. Это удобный инструмент для представления разных видов данных. Приведем примеры:

  • файловая система — папки и файлы внутри папок;
  • дерево решений — узлы, которые представляют разные варианты решения проблемы и их последствия; 
  • семейное древо — родители, дети и их потомки.

Создание вложенных списков

Создать такую структуру в Python несложно. Приведем простой пример.

a = [1, 2, 3]

b = [4, 5, 6]

nested_list = [list_a, list_b]

В приведенном примере список nested_list содержит еще два: a и b. 

Рассмотрим еще один пример — перечень книг:

books = [

 ["Тропик Рака", "Генри Миллер", 1934],

 ["Преступление и наказание", "Федор Достоевский", 1866],

 ["Окаянные дни", "Иван Бунин", 1926]

]

В этом примере каждый вложенный список содержит информацию об одной книге: название, имя автора, год издания. 

Получение доступа к отдельным элементам

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

nested_list = [[1, 2, 3], [4, 5, 6]]

Индекс для доступа к первому вложенному списку выглядит так:

first_sublist = nested_list[0]

print(first_sublist)  # Вывод: [1, 2, 3]

Для отдельных элементов код уже будет выглядеть так:

first_element = nested_list[0][0]

print(first_element) # Вывод: 1

Индексы можно использовать для навигации по любой глубине вложенности. Посмотрим на пример с перечислением книг. Чтобы получить название первой книги, используйте следующий индекс:

first_book_title = books[0][0]

Чтобы получить год издания второй книги:

second_book_year = books[1][2]

В итоге у разработчиков и администраторов баз данных появляется мощный механизм для навигации и извлечения информации из сложных иерархических структур.

Использование вложенных списков

Это довольно гибкий инструмент в Python, который применяется для решения разнообразных практических задач. Перечислим основные.

Представление таблиц: так можно хранить данные в виде таблицы, где внешний список представляет строки, а внутренние — столбцы.

Снова приведем пример — данные студентов.

students = [

  ["Иван Чернецкий", 20, "М"],

  ["Евгения Волкова", 19, "Ж"],

  ["Аркадий Дедов", 21, "М"],

]

Индексы для доступа к данным конкретных студентов выглядят так:

name = students[0][0] # "Иван Чернецкий"

age = students[1][1]  # 19

Вложенные списки могут представлять древовидные структуры, например, файловую систему на компьютере. Выглядит это так:

filesystem = [

  ["Документы", ["Тексты", "Изображения"]],

  ["Музыка", ["Классическая", "Поп", "Джаз", "Рок"]],

  ["Программы", []],

]

Иногда они используются для хранения двумерных массивов (матриц) для математических операций.

matrix = [

  [1, 2, 3],

  [4, 5, 6],

  [7, 8, 9]

]

Так выглядит индекс для доступа к числам в матрице:

element = matrix[1][2] # 6

Помимо этих примеров, вложенные списки применяются для:

  • организации данных — создание иерархических структур, например, для хранения семейного древа;
  • реализации алгоритмов — например, для создания алгоритмов поиска в глубину или в ширину;
  • обработки текста — разбиения на фразы, слова, символы.

Манипулирование вложенными списками

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

Приведем пример с добавлением чисел во вложенный список:

nested_list = [[1, 2, 3], [4, 5, 6]]

Добавление элемента в первый вложенный список делается так:

nested_list[0].append(4) # получается [[1, 2, 3, 4], [4, 5, 6]]

Если же нужно добавить еще один список, индекс будет выглядеть так:

nested_list.append([7, 8, 9]) # получается [[1, 2, 3, 4], [4, 5, 6], [7, 8, 9]]

Аналогичные примеры с удалением:

nested_list = [[1, 2, 3], [4, 5, 6]]

# Удаление элемента из первого вложенного списка

nested_list[0].pop(1) # получается [[1, 3], [4, 5, 6]]

# Удаление целого списка

nested_list.pop(1) # получается [[1, 3]]

Изменение элементов:

nested_list = [[1, 2, 3], [4, 5, 6]]

# Изменение одного элемента в первом вложенном списке

nested_list[0][1] = 5 # [[1, 5, 3], [4, 5, 6]]

# Изменение второго вложенного списка целиком

nested_list[1] = [7, 8, 9] # [[1, 5, 3], [7, 8, 9]]

При манипуляциях с данными стоит учитывать несколько нюансов:

  • важно понимать, какой именно список вы хотите изменить: внешний или внутренний; 
  • для изменения элементов используйте двойные индексы: nested_list[index_внешнего_списка][index_внутреннего_списка];
  • при добавлении или удалении элементов важно помнить о том, что это может повлиять на их порядок.

Циклы и вложенные списки

При работе с иерархическими структурами часто требуется перебирать их элементы.  Для этого удобно использовать циклы for. Снова приведем пример:

nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

for sublist in nested_list:

    for item in sublist:

        print(item, end=" ")

    print()  # Переход на новую строку

Поясняем работу цикла:

  • внешний цикл перебирает каждый вложенный список в рамках основного;
  • внутренний цикл for item in sublist перебирает каждый элемент в текущем вложенном списке sublist;
  • print(item, end=" ") выводит текущий элемент item без перехода на новую строку, добавляя пробел после него;
  • print() выводит пустую строку, чтобы перейти на новую строку после обработки предыдущей.

Результат выполнения кода будет выглядеть так:

```

1 2 3 

4 5 6 

7 8 9

В итоге у нас получается цифровая матрица.

Заключение

Иерархические структуры в Python — мощный инструмент для организации и представления данных в наглядном виде. Они подходят для задач по моделированию взаимосвязей между разными предметами или явлениями. 

Понимание принципов работы с вложенными списками помогает решать такие задачи, как:

  • создание иерархических меню;
  • представление древовидных структур данных;
  • обработка сложных датасетов (например, информации о географических регионах).

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