Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Васильев Ю. - Python для data science (Библиотека программиста) - 2023.pdf
Скачиваний:
6
Добавлен:
07.04.2024
Размер:
7.21 Mб
Скачать

54      Глава 2. Структуры данных Python

Поскольку кортежи неизменяемы, они не подходят для хранения значений данных, которые необходимо периодически обновлять.

Словари

Словарь — это еще одна широко используемая в Python структура данных. Словарь — изменяемая, неупорядоченная коллекция пар «ключ значение» (keyvalue), где каждый ключ является уникальным именем, которое указывает на элемент данных — значение. Словарь заключается в фигурные скобки. Каждый ключ отделяется от своего значения двоеточием, а пары «ключ — значение» разделяются запятыми, как показано ниже:

{'Make': 'Ford', 'Model': 'Mustang', 'Year': 1964}

Словари, как и кортежи, полезны для хранения разнородных данных об объектах реального мира. Как показано в этом примере, словари имеют дополнительное преимущество — возможность присвоить метку каждому элементу данных.

Список словарей

Как и другие типы данных, словари могут быть вложены в другие структуры. Наш список дел, реализованный в виде списка словарей, будет выглядеть следующим образом:

dict_list = [

{'time': '8:00', 'name': 'Pay bills'}, {'time': '8:30', 'name': 'Tidy up'}, {'time': '9:30', 'name': 'Walk the dog'},

{'time': '10:00', 'name': 'Go to the pharmacy'}, {'time': '10:30', 'name': 'Cook dinner'}

]

В отличие от кортежей, словари изменяемы. Это означает, что в паре «ключ — значение» значение можно изменить:

dict_list[1]['time'] = '9:00'

Этот пример также показывает, как обращаться к значениям словаря: в отличие от списков и кортежей, для этого используются имена ключей, а не числовые индексы.

Словари      55

Добавление элементов в словарь с помощью setdefault()

Метод setdefault() — удобный способ добавления новых данных в словарь. В качестве параметра он принимает пару «ключ — значение». Если указанный ключ уже существует, метод просто возвращает текущее значение этого ключа, а если не существует, setdefault() вставляет его в словарь с указанным значением. Для примера сначала создадим словарь под названием car с моделью

Jetta:

car = {

"brand": "Volkswagen", "style": "Sedan", "model": "Jetta"

}

Теперь попробуем добавить новое значение Passat по ключу model с помощью setdefault():

print(car.setdefault("model", "Passat"))

В результате получим вывод, показывающий, что значение ключа model не изменилось:

Jetta

Однако если указать новый ключ, setdefault()вставит пару «ключ — значение» и вернет значение:

print(car.setdefault("year", 2022))

Вывод:

2022

Теперь выведем на экран словарь целиком:

print(car)

56      Глава 2. Структуры данных Python

Вот что мы получим:

{

"brand": "Volkswagen", "style": "Sedan", "model": "Jetta", "year": 2022

}

Как видите, метод setdefault()избавляет от необходимости вручную проверять, есть ли уже в словаре ключ из вставляемой пары «ключ — значение». Ее можно добавлять в словарь без риска перезаписать значение уже существующего ключа.

Теперь, когда вы знаете, как работает setdefault(), рассмотрим практический пример. Подсчет количества вхождений каждого слова во фразу — частая задача NLP. В следующем примере показано, как решить ее с помощью словаря, используя метод setdefault(). Текст, который необходимо обработать:

txt = '''Python is one of the most promising programming languages today. Due to the simplicity of Python syntax, many researchers and scientists prefer Python over many other languages.'''

Первый шаг — удаление из текста знаков препинания. Без этого шага "languages"

и"languages." будут считаться двумя отдельными словами. Удаляем точки

изапятые:

txt = txt.replace('.', '').replace(',', '')

Далее разбиваем текст на слова и помещаем их в список:

lst = txt.split() print(lst)

Получаем следующий список слов:

['Python', 'is', 'one', 'of', 'the', 'most', 'promising', 'programming',

'languages', 'today', 'Due', 'to', 'the', 'simplicity', 'of', 'Python', 'syntax', 'many', 'researchers', 'and', 'scientists', 'prefer', 'Python',

'over', 'many', 'other', 'languages']

Словари      57

Теперь можем подсчитать количество вхождений каждого слова в список. Это можно реализовать с помощью словаря, используя метод setdefault():

dct = {}

for w in lst:

c = dct.setdefault(w,0) dct[w] += 1

Сначала создаем пустой словарь. Затем добавляем в него пары «ключ — значение», используя слова из списка в качестве ключей. Метод setdefault() устанавливает начальное значение для каждого ключа, равное 0. Затем, при первом появлении определенного слова, значение увеличивается на 1, то есть значение счетчика теперь равно единице. При последующих появлениях этого слова к уже имеющемуся значению добавляется 1 с помощью оператора +=, точно подсчитывая вхождения.

Перед тем как выводить словарь, возможно, понадобится отсортировать слова по количеству вхождений:

dct_sorted = dict(sorted(dct.items(), key=lambda x: x[1], reverse=True)) print(dct_sorted)

Используя метод словаря items(), можно преобразовать словарь в список кортежей, где каждый кортеж будет состоять из ключа и его значения. Таким образом, когда внутри функции sorted()в lambda мы указываем x[1]для параметра key, мы делаем сортировку по первому элементу кортежа (с индексом 1), то есть по значениям (количеству слов) исходного словаря. Полученный словарь выглядит следующим образом:

{'Python': 3, 'of': 2, 'the': 2, 'languages': 2, 'many': 2, 'is': 1, 'one': 1, 'most': 1, 'promising': 1, 'programming': 1, 'today': 1, 'Due': 1, 'to': 1, 'simplicity': 1, 'syntax': 1, 'researchers': 1, 'and': 1, 'scientists': 1, 'prefer': 1, 'over': 1, 'other': 1}

Преобразование JSON в словарь

С помощью словарей структуры данных Python можно преобразовывать в строки JSON и наоборот. Вот как загрузить строку, представляющую собой документ JSON, в словарь, используя лишь оператор присваивания: