Вложенные структуры

Допустим, вы где-то скачали файл с данными о кино. Но выглядит он совсем жутко:

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'
   }
]

Попробуйте бесплатные уроки по Python

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

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.