Вложенные структуры
Допустим, вы где-то скачали файл с данными о кино. Но выглядит он совсем жутко:
films_data = [
{
"adult": false,
"original_title": "Ariel",
"overview": "С героем фильма шахтером Таисто случается серия неудач…",
"budget": 0,
"release_date": "1988-10-21",
"genres": [
{
"id": 18,
"name": "драма"
},
{
"id": 80,
"name": "криминал"
},
{
"id": 35,
"name": "комедия"
}
],
},
{
"adult": false,
"original_title": "Varjoja paratiisissa",
"overview": "",
"budget": 0,
"release_date": "1986-10-17",
"genres": [
{
"id": 18,
"name": "драма"
},
{
"id": 35,
"name": "комедия"
}
],
},
...
Достаём первый фильм
Данная структура — это список. Снаружи стоят квадратные скобки, а внутри через запятую лежат огромные словари с информацией о фильмах. Попробуем достать первый фильм:
first_film = films_data[0]
print(first_film)
Как ни странно, из всей кучи фильмов перед вами осталась только информация о первом:
{
"adult": false,
"original_title": "Ariel",
"overview": "С героем фильма шахтером Таисто случается серия неудач…",
"budget": 0,
"release_date": "1988-10-21",
"genres": [
{
"id": 18,
"name": "драма"
},
{
"id": 80,
"name": "криминал"
},
{
"id": 35,
"name": "комедия"
}
]
}
Достаём название фильма
Информация о фильме — это обычный словарь.
first_film = films_data[0]
first_film_title = first_film['original_title']
print(first_film_title)
# Вывелось Ariel
Достаём жанры фильма
Жанры фильма в нашей структуре — это список внутри словаря внутри списка. Достанем их:
first_film = films_data[0]
first_film_genres = first_film['genres']
print(first_film_genres)
Получится:
[
{
"id": 18,
"name": "драма"
},
{
"id": 80,
"name": "криминал"
},
{
"id": 35,
"name": "комедия"
}
]
По жанрам тоже легко «путешествовать»:
first_film = films_data[0]
first_film_genres = first_film['genres']
for genre in first_film_genres:
print(genre)
Этот код выведет все жанры через пустую строку:
{
"id": 18,
"name": "драма"
}
{
"id": 80,
"name": "криминал"
}
{
"id": 35,
"name": "комедия"
}
Меньше переменных
Сейчас, чтобы добраться до id первого жанра придётся создать аж 4 переменные:
first_film = films_data[0]
first_film_genres = first_film['genres']
first_genre = first_film_genres[0]
first_genre_id = first_genre['id']
Переменные можно не создавать, если расставить индексы в цепочку:
first_genre_id = films_data[0]['genres'][0]['id']
Когда Python прочтёт films_data[0]
, он сразу достанет первый элемент в списке films_data
и подставит его вместо films_data[0]
. Когда он начнёт читать дальше, он увидит ['genres']
, и возьмёт этот ключ от того, что только что посчитал слева, т.е. от первого фильма. И так далее, Python по цепочке распутает эту конструкцию сам, без дополнительных переменных.
Как создать вложенную структуру
Допустим, у вас откуда-то есть данные о фильмах:
first_film_title = "Пила 1"
first_film_budget = 100
second_film_title = "Пила 2"
second_film_budget = 200
Очень легко собрать из этого список:
budgets = [first_film_budget, second_film_budget]
# Или так
budgets = []
budgets.append(first_film_budget)
budgets.append(second_film_budget)
Так же легко собрать для каждого фильма словарь:
first_film = {
"title":"Пила 1",
"budget": 100
}
# Или так
first_film = dict()
first_film['title'] = "Пила 1"
first_film['budget'] = 100
и положить эти словари в список:
films = [first_film, second_film]
# Или так
films = []
films.append(first_film)
films.append(second_film)
Получится сложная конструкция:
[
{
'budget':100,
'title':'Пила 1'
},
{
'budget':200,
'title':'Пила 2'
}
]