В предыдущей статье речь шла о переменных в Python. Теперь нужно обсудить вторую важную тему, без которой невозможно работать с этим языком в Data Science — структуры данных в Python.
Это практическое руководство!
Желательно повторять те части, где нужно писать код, и решать задачи в конце статьи! Также рекомендуется вернуться к прошлым материалам, если вы еще не ознакомились с ними.
Почему структуры данных в Python так важны?
Представьте книгу. Пусть это будет «Практическая статистика для специалистов Data Science» П. Брюса и Э. Брюса. Сохранить эту информацию можно, поместив ее в переменную.
my_book = "Практическая статистика для специалистов Data Science"
Готово!
А если рядом лежат также «Цифровая крепость» Дэна Брауна и «Игра престолов» Джорджа Мартина? Как сохранить их? Можно снова воспользоваться переменными:
my_book2 = "Цифровая крепость"
my_book3 = "Игра престолов"
А если позади целый книжный шкаф? Вот здесь и появляется проблема. Иногда в Python нужно хранить релевантную информацию в одном объекте, а не разбивать ее по переменным.
Вот зачем нужны структуры данных!
Структуры данных Python
В Python 3 основные структуры данных:
- Списки
book_list = ['Игра престолов', 'Цифровая крепость', 'Практическая статистика для специалистов Data Science']
- Кортежи
book_tuple = ('Игра престолов', 'Цифровая крепость', 'Практическая статистика для специалистов Data Science')
- Словари
book_dictionary = {'Джордж Мартин': 'Игра престолов', 'Дэн Браун': 'Цифровая крепость', 'П. & Э. Брюсы': 'Практическая статистика для специалистов Data Science'}
Все три нужны для разных ситуаций и использовать их необходимо по-разному.
Перейдем к деталям!
Первая структура данных Python: Список
Начнем с самого простого — списков в Python.
Список — это последовательность значений. Это данные, заключенные в квадратные скобки и разделенные запятыми. Простой пример — список целых чисел:
[3, 4, 1, 4, 5, 2, 7]
Важно понимать, что в Python список является объектом, поэтому работать с ним можно так же, как и с любыми другими типами данных (например, целыми числами, строками, булевыми операторами и так далее). Это значит, что список можно присвоить переменной, чтобы хранить ее таким образом и получать доступ в дальнейшем более простым способом:
my_first_list = [3, 4, 1, 4, 5, 2, 7]
my_first_list
Список может содержать другие типы данных, включая строки, логические значения и даже другие списки. Помните собаку Freddie из прошлой статьи?
Ее параметры можно сохранить в одном списке, а не разбивать на 5 разных переменных:
dog = ['Freddie', 9, True, 1.1, 2001]
Теперь предположим, что Freddie принадлежит две вещи: кость и маленький мяч. Их можно сохранить внутри списка отдельным списком.
dog = ['Freddie', 9, True, 1.1, 2001, ['bone', 'little ball']]
На самом деле, вот так углубляться в дерево списков можно бесконечно. Этот прием (официально он называется «вложенными списками») будет важен при работе с Data Science в Python — например, при создании многомерных массивов numpy для запуска корреляционных анализов… но сейчас не об этом! Главное, что нужно запомнить — списки можно хранить внутри других списков.
Попробуйте:
sample_matrix = [[1, 4, 9], [1, 8, 27], [1, 16, 81]]
Чувствуете себя ученым? Стоило бы, потому что вы создали двухмерный массив размерами 3-на-3.
Как получить доступ к конкретному элементу в списке Python?
Теперь, когда значения сохранены, нужно разобраться, как получать к ним доступ в будущем. Вернуть целый список можно с помощью имени переменной. Например dog
Но как вызвать один элемент из списка? Сперва подумайте, как можно обратиться к одному из элементов в теории? Единственное, что приходит в голову, — положение значения. Так, если нужно вернуть первый элемент из списка dog
, необходимо ввести его название и номер элемента в скобках: [1]
. Попробуйте: dog[1]
Что??? Цифра 9
была вторым элементом списка, а не первым. Однако в Python это работает иначе. Python использует так называемое «индексирование с нуля». Это значит, что номер первого элемента — это всегда [0]
, второго — [1]
, третьего — [2]
и так далее. Это важно помнить, работая со структурами данных в Python.
Если вам кажется, что это слишком сложно, просто почитайте открытое письмо известного ученого Дейкстра, написанное в 1982 году: https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html. А теперь просто перестаньте думать об этом и запомните, что так будет всегда!
Вот подробный пример!
Собака Freddie:
dog = ['Freddie', 9, True, 1.1, 2001, ['bone', 'little ball']]
Попробуйте вывести все элементы списка один за одним:
dog[0]
dog[1]
dog[2]
dog[3]
dog[4]
dog[5]
Запутанно… Но к этому можно привыкнуть.
Как получить доступ к определенному элементу вложенного списка в Python
Еще один важный момент о Freddie. Нужно вывести его вещи друг за другом
dog = ['Freddie', 9, True, 1.1, 2001, ['bone', 'little ball']]
Догадаетесь, как получить элемент bone
, заключенный во вложенный список? Это максимально интуитивно.
Он будет нулевым элементом пятого элемента:
dog[5][0]
Если на 100% не понятно, почему все работает именно так, поиграйтесь с этим набором данных и вы разберетесь: sample_matrix = [[1, 4, 9], [1, 8, 27], [1, 16, 81]]
.
Как получить доступ к нескольким элементам списка Python
Вот еще один трюк. Можно использовать двоеточие между двумя числами в скобках, чтобы получить последовательность значений.
dog[1:4]
Пока это все, что вам нужно знать о списках Python.
Вторая структура данных Python: Кортежи
Что такое кортеж в Python? Во-первых, начинающий специалист Data Science не должен много думать об этой структуре. Можете и вовсе пропустить этот раздел.
Если все-таки остались:
Кортеж в Python — почти то же самое, что и список в Python с небольшими отличиями.
- Синтаксис: при объявлении используются не квадратные скобки, а круглые.
Список:book_list = ['Игра престолов', 'Цифровая крепость', 'Практическая статистика для специалистов Data Science']
Кортежи
book_tuple = ('Игра престолов', 'Цифровая крепость', 'Практическая статистика для специалистов Data Science')
- Список — изменяемый тип данных, поэтому в нем можно добавлять, удалять или изменять элементы. Кортеж — неизменяемый тип данных. Он остается таким, каким был и объявлен. Это строгость пригодится, чтобы сделать код безопаснее.
- Кортежи работают быстрее, чем списки в Python в одних и тех же операциях.
В остальном кортежи можно использовать так же, как и списки. Даже возвращать отдельный элемент нужно с помощью квадратных скобок. (Попробуйте book_tuple[1]
на новом кортеже).
book_tuple[1]
'Цифровая крепость'
Еще раз: ничего из вышесказанного не будет вас заботить первое время, но хорошо знать хотя бы что-нибудь о кортежах.
Третья структура данных Python: Словари
Словари — это совсем другая история. Они сильно отличаются от списков и очень часто используются в проектах data science.
Особенность словарей в том, что у каждого значения есть уникальный ключ. Взглянем еще раз на собаку Freddie:
dog = ['Freddie', 9, True, 1.1, 2001, ['bone', 'little ball']]
Это значения с параметрами собаки, которые нужно сохранить. В словаре для каждого значения можно назначить свой ключ так, чтобы понимать, что они обозначают.
`dog_dict = {'name': 'Freddie', 'age': 9, 'is_vaccinated': True, 'height': 1.1, 'birth_year': 2001, 'belongings': ['bone', 'little ball']}`
Вывод заранее форматируется Python. Чтобы лучше разобраться, то же самое можно сделать изначально, перенеся каждое значение на новую строку:
dog_dict = {'name': 'Freddie',
'age': 9,
'is_vaccinated': True,
'height': 1.1,
'birth_year': 2001,
'belongings': ['bone', 'little ball']}
Как можно видеть, вложенный список (в этом примере belongings
) как значение словаря не является проблемой.
Это что касается внешнего вида словарей в Python.
Как получить доступ к конкретному элементу словаря Python
Самое важное, что нужно запомнить о получении доступа к элементу любого типа в любой структуре данных Python, это то, что вне зависимости от структуры (список, кортеж или словарь), нужно всего лишь ввести название структуры и универсальный идентификатор элемента в квадратных скобках (например, [1]
).
То же касается и словарей.
Единственное отличие в том, что для списков и кортежей идентификатором выступает номер элемента, а здесь ключ. Попробуйте:
dog_dict['name']
Примечание: наверняка возникает вопрос, а можно ли использовать число для доступа к значению словаря. Нет, потому что словари в Python по умолчанию не упорядочены — это значит, что ни у одной пары ключ-значение нет своего номера.
Примечание: нельзя также вывести ключ с помощью значения. Python попросту не предназначен для этого.
Проверьте себя
Вы многое узнали о структурах данных. Даже если вы не выполняли прошлые уроки в конце статей, сделайте исключение для этой. Структуры — это то, что придется использовать постоянно, поэтому сделайте себе одолжение и попробуйте разобраться во всем на 100%
Упражнение:
- Скопируйте этот супер-вложенный список-словарь Python в Jupyter Notebook и присвойте его переменной
test
.test = [{'Arizona': 'Phoenix', 'California': 'Sacramento', 'Hawaii': 'Honolulu'}, 1000, 2000, 3000, ['hat', 't-shirt', 'jeans', {'socks1': 'red', 'socks2': 'blue'}]]
- Выполните эти 6 небольших заданий, выводя конкретные значения из списка-словаря! Каждое следующее будет немного сложнее.2.1. Верните
2000
2.2. Верните словарь с городами и штатами{'Arizona': 'Phoenix', 'California': 'Sacramento', 'Hawaii': 'Honolulu'}
2.3. Верните список вещей['hat', 't-shirt', 'jeans', {'socks1': 'red', 'socks2': 'blue'}]
2.4. Верните слово'Phoenix'
2.5. Верните слово'jeans'
2.6. Верните слово
'blue'
.
.
.
.
.
.
Решения
test[2]
— главная сложность в том, чтобы запомнить, что индексирование начинается с нуля, а это значит, что2000
— второй элемент.test[0]
— это выведет весь словарь из основного списка.test[4]
— как и в предыдущих примерах, будет выведен вложенный список.test[0]['Arizona"]
— следующий этап для второго задания. Здесь с помощью ключа'Arizona'
вызывается значение'Phoenix'
.test[4][2]
— это решение связано с третьим заданием. Обращаемся к'jeans'
по номеру. Главное не забыть об индексировании с нуля.test[4][3]['socks2']
— последний шаг — вызов элемента из словаря в списке, вложенного в другой список
Итог
Итак, вы справились с еще одним руководством по Python! Это почти все, что нужно знать о структурах данных. Впереди будет еще много небольших, но важных деталей (например, о том, как добавлять, удалять и изменять элементы в списке или словаре)… но до этого необходимо разобраться с функциями и методами.