Вложенные списки и словари в Python: сложные структуры данных
Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе
Представьте себе школу. В школе есть классы. В каждом классе есть ученики. У каждого ученика есть имя, возраст и список оценок. Это данные внутри данных внутри данных, то есть вложенные данные.
В реальном программировании вложенные данные встречаются повсюду. Соцсеть хранит пользователей, у которых есть посты, а у каждого поста есть комментарии. Игра хранит уровни с врагами, а у каждого врага есть характеристики. В интернет-магазине есть категории с товарами, а у товаров есть отзывы.
В этом уроке вы научитесь создавать вложенные списки и словари, получать из них данные, изменять и перебирать их. Эти навыки необходимы для работы с реальными данными, особенно с JSON от веб-API.
Как работают списки внутри списков?
Элементами списка могут быть другие списки. Так получается двумерная структура, похожая на сетку или таблицу. Представьте электронную таблицу со строками и столбцами.
['X', 'O', 'X'] ['O', 'X', 'O'] ['X', ' ', 'O']
Чтобы получить элемент вложенного списка, используют две пары квадратных скобок. Первая выбирает строку, вторая выбирает столбец.
X X
Тем же синтаксисом с двумя парами скобок можно и изменять элементы. Именно так делается ход в игре «крестики-нолики».
['X', ' ', 'X'] [' ', 'O', ' '] [' ', ' ', ' ']
Как работают вложенные словари?
Значением словаря может быть другой словарь. Так получается древовидная структура, в которой вы спускаетесь по ключам всё глубже, пока не доберётесь до нужных данных.
Ms. Smith 25
Каждая пара квадратных скобок опускает вас на уровень глубже. school['Room 101'] даёт внутренний словарь. Затем ['teacher'] даёт значение из этого внутреннего словаря.
Добавлять новые ключи и обновлять значения можно на любом уровне.
Room 101: Ms. Smith teaches Algebra Room 103: Ms. Lee teaches Science
Списки словарей: самый частый приём
Чаще всего в реальном программировании встречается список словарей. Каждый словарь описывает одну запись (ученика, товар, пользователя), а список хранит все записи вместе.
Если вы когда-нибудь видели данные из веб-API или базы данных, то почти наверняка они выглядели как список словарей.
Alice 97 Alice is 15 and scored 92 Bob is 16 and scored 85 Charlie is 15 and scored 97
Шаблон всегда один: list[index][key]. Индекс выбирает словарь. Ключ выбирает значение внутри этого словаря.
Как безопасно добраться до глубоко вложенных данных
Реальные данные бывают вложены на несколько уровней. В компании есть отделы, в каждом отделе есть команды, в каждой команде есть сотрудники. Чтобы добраться до глубоко вложенных данных, приходится выстраивать цепочку из нескольких пар скобок.
Alice Diana
Опасность глубокой вложенности в том, что любой отсутствующий ключ вызывает KeyError. Если данные могут быть неполными, используйте метод .get(): он возвращает None (или значение по умолчанию), а не завершается ошибкой.
Python developer No site default
Как перебирать вложенные структуры данных
Для вложенных данных часто нужны вложенные циклы. Внешний цикл проходит по элементам верхнего уровня, а внутренний по элементам внутри каждого из них.
Math: average = 87.5 English: average = 85.0 Science: average = 87.2
grid[0][0] = 1 grid[0][1] = 2 grid[0][2] = 3 grid[1][0] = 4 grid[1][1] = 5 grid[1][2] = 6 grid[2][0] = 7 grid[2][1] = 8 grid[2][2] = 9
Для списков словарей обычно хватает одного цикла, потому что каждый словарь представляет собой одну законченную запись.
Laptop: $999 Phone: $699
Как создавать вложенные структуры данных с нуля
Вложенные данные не всегда приходят к вам готовыми: иногда их нужно собрать самостоятельно. Частый приём: начать с пустой структуры и добавлять в неё элементы внутри цикла.
a: ['apple', 'avocado'] b: ['banana', 'blueberry'] c: ['cherry', 'coconut']
Ещё одна частая задача: превратить плоские данные во вложенную структуру. Например, сделать из плоского списка баллов список словарей.
{'name': 'Alice', 'age': 15, 'grade': 92}
{'name': 'Bob', 'age': 16, 'grade': 85}
{'name': 'Charlie', 'age': 15, 'grade': 97}Практические упражнения
У вас есть сетка чисел 3x3. Выведите центральное значение (строка 1, столбец 1), а затем значение в правом нижнем углу (строка 2, столбец 2). Каждое на отдельной строке.
Внимательно прочитайте код. Что он выведет? Впишите вывод точно в том виде, в каком его напечатает Python.
Переберите список учеников и найдите того, у кого самая высокая оценка. Выведите его имя и оценку в формате: Best: Name (Grade)
Сгруппируйте слова в словарь по первой букве. Затем выведите каждую группу на отдельной строке в формате: letter: [words]
Выводите буквы в алфавитном порядке.
Этот код пытается создать сетку 3x3 и записать «X» только в центральную клетку. Но что-то не так: запустите его и убедитесь сами! Исправьте ошибку, чтобы «X» стоял только в центре, а во всех остальных клетках осталась «.».
Каждую строку сетки выведите на отдельной строке.
У вас есть словарь, в котором каждый ключ означает название курса, а каждое значение представляет собой список словарей с учениками. Посчитайте среднюю оценку по каждому курсу и выведите её в формате: ClassName: average
Округлите каждое среднее до одного знака после точки. Выводите курсы в алфавитном порядке.