#2 Python для Data Science — Структуры данных

В предыдущей статье речь шла о переменных в 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 из прошлой статьи?

Данные о Freddie в переменных

Ее параметры можно сохранить в одном списке, а не разбивать на 5 разных переменных:

dog = ['Freddie', 9, True, 1.1, 2001]

Данные о Freddie в списке

Теперь предположим, что 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 — функции и методы Python list()

Запутанно… Но к этому можно привыкнуть.

Как получить доступ к определенному элементу вложенного списка в 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 с небольшими отличиями.


  1. Синтаксис: при объявлении используются не квадратные скобки, а круглые.
    Список:

    book_list = ['Игра престолов', 'Цифровая крепость', 'Практическая статистика для специалистов Data Science']
    

    Кортежи

    book_tuple = ('Игра престолов', 'Цифровая крепость', 'Практическая статистика для специалистов Data Science')
    
  2. Список — изменяемый тип данных, поэтому в нем можно добавлять, удалять или изменять элементы. Кортеж — неизменяемый тип данных. Он остается таким, каким был и объявлен. Это строгость пригодится, чтобы сделать код безопаснее.
  3. Кортежи работают быстрее, чем списки в 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%

Упражнение:

  1. Скопируйте этот супер-вложенный список-словарь Python в Jupyter Notebook и присвойте его переменной test.
    test = [{'Arizona': 'Phoenix', 'California': 'Sacramento', 'Hawaii': 'Honolulu'},
    1000,
    2000,
    3000,
    ['hat', 't-shirt', 'jeans', {'socks1': 'red', 'socks2': 'blue'}]]
    
  2. Выполните эти 6 небольших заданий, выводя конкретные значения из списка-словаря! Каждое следующее будет немного сложнее.2.1. Верните 20002.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'

.

.

.

.


.

.

Решения

  1. test[2] — главная сложность в том, чтобы запомнить, что индексирование начинается с нуля, а это значит, что 2000 — второй элемент.
  2. test[0] — это выведет весь словарь из основного списка.
  3. test[4] — как и в предыдущих примерах, будет выведен вложенный список.
  4. test[0]['Arizona"] — следующий этап для второго задания. Здесь с помощью ключа 'Arizona' вызывается значение 'Phoenix'.
  5. test[4][2] — это решение связано с третьим заданием. Обращаемся к 'jeans' по номеру. Главное не забыть об индексировании с нуля.
  6. test[4][3]['socks2'] — последний шаг — вызов элемента из словаря в списке, вложенного в другой список

Структуры данных - Проверьте себя

Итог

Итак, вы справились с еще одним руководством по Python! Это почти все, что нужно знать о структурах данных. Впереди будет еще много небольших, но важных деталей (например, о том, как добавлять, удалять и изменять элементы в списке или словаре)… но до этого необходимо разобраться с функциями и методами.