Share This
Связаться со мной
Крути в низ
Categories
//Использование словарей в Python на практике

Использование словарей в Python на практике

31.01.2022Category : Python

Сегодня мы поговорим про использование словарей в Python на практике. Вы узнаете, как создать словарь, загрузить в него данные, отфильтровать их, получать и сортировать значения, а также выполнять другие операции со словарем.

Словари Python и набор инструментов Data Science

Для работы с данными в Python их нужно хранить в соответствующей структуре данных. Словарь — одна из специальных встроенных структур данных Python. Название говорит само за себя: данные хранятся в виде значений, к которым можно получить доступ с помощью ключа.

Если вы ищете слово «python» в обычном толковом словаре, вы обычно начинаете с поиска той части книги, где слова начинаются с «р». Затем среди них выбираете ту часть, где вторая буква — «у». Потом ищете «t» и так далее, пока не найдете полное слово. Словарная статья сообщит вам, что «python» — это большая неядовитая змея, сжимающая свою добычу, или язык программирования высокого уровня.

Бумажный словарь является хорошим помощником потому, что слова в нем упорядочены в алфавитном порядке. И, немного потренировавшись, вы сможете находить нужные слова очень быстро.

Словарь в Python работает аналогичным образом. Сохраненные элементы словаря могут быть извлечены очень быстро по их ключу. То есть в словарях, в отличие от списков, Python отслеживает, где найти определенную информацию.

Как создать словарь Python

Предположим, вы проводите инвентаризацию фруктов в корзине. Вы сохраняете количество каждого типа фруктов в словаре. Существует несколько способов создания словаря, но в этом уроке мы не будем усложнять. Полный обзор можно найти в документации Python по словарям.

Наиболее важный отличительный признак словаря — фигурные скобки {}. Кроме того, для каждого элемента словаря нужно разделение ключа и значения двоеточием :.

Приведенная ниже переменная fruit — словарь. Вы можете получить доступ к любому элементу из этого словаря, поместив ключ в квадратные скобки []. То же самое можно сделать еще и с помощью метода .get().

>>> fruit = {"apple" : 5, "pear" : 3, "banana" : 4, "pineapple" : 1, "cherry" : 20}  # Обращаемся к словарю fruit напрямую (без метода get) и выводим значение ключа "banana" >>> fruit["banana"] # 4  # Выводим значение ключа "banana" при помощи метода get >>> fruit.get("banana") # 4

Загрузка данных в словарь в Python

Теперь давайте поместим в словарь какие-нибудь настоящие данные, а точнее — вложенный словарь. То есть в словаре в качестве значения будет не цифра или строка, а другой словарь.

Вложенность позволяет легко хранить в словаре таблицы или матрицы.

ispolzovanie slovarej v python na praktike 919cb41 - Использование словарей в Python на практике

Лаборатория Django-разработки

За 3 месяца отработай навыки Django-разработки до профессионального уровня на серьезном проекте под руководством наставника.

Подробнее ×

Данные, которые мы будем использовать, это обзоры книги Donna Tartt «The Goldfinch». Они взяты из набора обзоров книг Amazon из репозитория twielfaert. Эти обзоры были сохранены в простом файле csv, со значениями, разделенными табуляцией. То есть это обычный текстовый файл со столбцами.

Таблица содержит четыре столбца: оценка обзора, URL-адрес, заголовок обзора и текст обзора (review score, url, review title и review text).

Есть несколько способов представить это в виде словаря. К примеру, можно взять URL-адреса в качестве ключей словаря и поместить другие столбцы во вложенный словарь.

import urllib.request import random  # Загружаем данные из удаленного источника (URL) file = urllib.request.urlopen("https://gist.githubusercontent.com/twielfaert/a0972bf366d9aaf6cb1206c16bf93731/raw/dde46ad1fa41f442971726f34ad03aaac85f5414/Donna-Tartt-The-Goldfinch.csv") f = file.read()  # Преобразовываем поток битов в строки text = f.decode(encoding='utf-8',errors='ignore')  # Делим единую строку на отдельные строки lines = text.split("n")  # Инициализируем словарь reviews = {}  # Заполняем словарь for line in lines:   l = line.strip().split("t")      # Это лишь тренировка, позволяющая увидеть, что поступает в словарь   score = l[0]    id = l[1]   title = l[2]   review = l[3]      reviews[id] = {"score" : score, "title" : title, "review" : review}  # Берем рандомный ключ словаря и выводим его значение print(reviews[random.choice(list(reviews.keys()))])

В этом случае нам посчастливилось получить набор данных, в котором нет пропущенных значений. Но не всегда так везет. Реальные наборы данных «из дикой природы» часто беспорядочны (неправильное форматирование, ошибки кодирования, отсутствующие данные и т.д.).

Однако вы можете легко проверить, все ли ключи на месте, сравнив количество строк в файле с количеством ключей в словаре.

# Считаем количество строк в файле print("Number of lines: " + str(len(lines)))  # Считаем ключи словаря, их должно быть столько же, сколько строк в файле print("Number of dictionary keys: " + str(len(reviews.keys())))

Как отфильтровать словарь в Python

Теперь, когда обзоры Amazon сохранены в словаре, пришло время попробовать поработать с ними. Допустим, вас интересуют плохие отзывы. Вы хотите посмотреть, что написали люди в отзывах с оценками в 1,0 балл.

Оценки обзора хранятся в значениях словаря, что означает, что нам придется перебирать словарь в цикле. К сожалению, мы не можем просто использовать цикл for для просмотра словаря.

Элементы словаря в Python имеют не только ключ и значение, но и специальный итератор для циклического перебора. Вместо for item in dictionary нам нужно использовать for key, value in dictionary.items(). То есть нужно использовать этот конкретный итератор и две переменные (ключ и значение) вместо одной. Также есть отдельные итераторы для ключей (.keys()) и значений (.values()).

Мы сохраним ключи обзоров с низкой оценкой в ​​списке с именем lowscores, чтобы позже иметь возможность использовать этот список повторно.

# Сохраняем ключи обзоров с низкой оценкой (1.0) в список lowscores = [] for key, value in reviews.items():   if float(value["score"]) == 1.0: # Приводим оценку к float     lowscores.append(key)  # Выводим все отзывы с низкой оценкой for item in lowscores:   print(reviews[item])

Операции со словарем в Python

Если словарь, содержащий полный набор данных, большой, разумнее использовать только что полученный список lowscores для создания совершенно нового словаря. Таким образом вам не придется удерживать в памяти весь большой словарь для дальнейшей работы с отзывами с низкими оценками. Вы сможете просто работать с соответствующим подмножеством исходных данных.

Для создания нового словаря мы используем ключи, хранящиеся в lowscores. Для этого есть два варианта: просто извлечь соответствующие элементы из исходного словаря с помощью метода .get(), оставляя оригинал нетронутым, или использовать .pop(), который навсегда удаляет ненужные элементы из исходного словаря.

Код может выглядеть следующим образом:

subset = dict([(k, reviews.get(k)) for k in lowscores])

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

Однако не рекомендуется использовать генераторы, если вы еще не знакомы с ними. Цикл for легче читать и понимать.

Вы можете сравнить традиционный стиль цикла for с генератором словаря и убедиться, что они действительно дают одинаковый результат:

# Использование цикла for forloop = {} for k in lowscores:   forloop[k] = reviews[k]  # Добавляем подходящий метод для получения соответствующих элементов из словаря `reviews` dictcomp = {k : reviews.get(k) for k in lowscores}  # Проверяем, равны ли полученные объекты print(forloop == dictcomp)

Предположим, теперь вы хотите переупорядочить словарь, чтобы в качестве ключей использовались оценки обзоров, а не идентификаторы. Для этого вы можете использовать цикл for, указав ключи и значения и создав новый словарь. Вам нужно будет получить score из первоначально словаря, чтобы использовать его в качестве нового ключа.

Чтобы немного упростить код, создадим новый словарь как объект newvalues ​​в отдельной строке перед заполнением scoredict ключами-идентификаторами и словарем newvalues ​​в качестве значений:

from collections import defaultdict  scoredict = defaultdict(list)  for key, value in reviews.items():   newvalues = {'id' : key, "title" : value['title'], "review" : value['review']}   # Используем 'score' из значений (!) исходного словаря как ключ для нового   scoredict[value['score']].append(newvalues)    # Выводим ключи словаря, чтобы удостовериться, что это оценки обзоров print(scoredict.keys())

Как сортировать словари в Python

Поскольку мы загрузили в словарь реальный набор данных, мы можем выполнить его базовый анализ. Если нас интересуют слова, которые связаны с негативным отношением к роману, можно провести низкоуровневый анализ настроений. Для этого можно составить частотный список слов в негативных отзывах (оценка 1,0).

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

Теги мы удалим при помощи регулярного выражения: re.sub(«<.*?>», «»). Регулярные выражения — очень полезный инструмент при работе с текстовыми данными. Подробнее о них можно почитать в статье «Регулярные выражения в Python». В данном случае мы захватываем части строки, которые начинаются с символа <, за которым следует (или не следует) любое количество других символов, за которыми идет символ >.Части строки, соответствующие этому шаблону, удаляются путем замены «ничем» (пустые кавычки).

Также в Python есть встроенная функция для перевода букв в нижний регистр. К интересующей нас строке нужно просто добавить .lowercase().

Затем мы создаем частотный словарь, используя defaultdict вместо обычного словаря. Это гарантирует, что каждый «ключ» будет инициализирован, и мы сможем просто увеличить частоту на 1.

Без defaultdict при попытке обратиться к несуществующему ключу (чтобы увеличить счетчик) Python выдал бы ошибку. Это можно обойти, сначала проверив, есть ли ключ в словаре. Однако это решение куда менее элегантно, чем использование defaultdict.

import re # Import defaultdict from collections import defaultdict  freqdict = defaultdict(int) for item in lowscores:   review = reviews[item]["review"]   cleantext = re.sub(r'<.*?>', '', review).strip().split() # Удаляем HTML-теги и делим обзор на слова (разделенные пробелами)   for word in cleantext:    # Переводим все в нижний регистр     word = word.lower()          # Увеличиваем счетчик на единицу     freqdict[word] += 1  print(freqdict)

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

Поскольку обычные словари (в том числе defaultdict) не могут быть упорядочены, нам нужен другой класс. Для этой цели отлично подойдет OrderedDict. Он хранит словарь в порядке добавления элементов. То есть нужно сперва отсортировать элементы, а затем сохранить их в новом OrderedDict.

Сортировка с помощью sorted()

Функция sorted() принимает 3 аргумента. Первый — это объект, который вы хотите отсортировать, т.е. наш частотный словарь. Помните, однако, что доступ к парам ключ-значение в словаре возможен только через функцию .items(). Если вы забудете об этом, Python вернет первый попавшийся ключ. Другими словами: если вы перебираете словарь и ваш код ведет себя странно, проверьте, добавили ли вы функцию .items().

Второй аргумент указывает, какая часть первого аргумента должна использоваться для сортировки: key=lambda item: item[1]. Первая часть говорит сама за себя: вы хотите, чтобы ключи были отсортированы.

Лямбда-функция — это анонимная функция, которую нельзя вызывать извне. Это альтернативный способ перебрать весь диапазон объектов с помощью одной функции. В этом случае она просто использует значение словаря (item[1], при этом item[0] является ключом) в качестве аргумента для сортировки.

Последний аргумент, reverse, указывает, должна ли сортировка проходить по возрастанию или по убыванию. В этом случае мы хотим видеть наиболее часто встречающиеся слова вверху. Поэтому мы должны явно указать, что reverse=True.

Если бы вы сейчас посмотрели на верхнюю часть отсортированных элементов, вы были бы разочарованы словами, которые доминируют в этом частотном списке. Это были бы просто «служебные слова», такие как «the», «and», «a» и т.д. В английском (и, конечно, многих других языках) полно этих слов. Однако они в основном используются для связки слов и сами по себе совершенно бессмысленны.

В текстовой аналитике используются так называемые стоп-листы, чтобы исключить из анализа эти часто встречающиеся слова. Мы применим более простой подход, проигнорировав первые 10% слов и рассматривая только те слова, которые входят в 90% наиболее часто встречающихся.

Вы увидите, что в верхней части этого списка есть более интересные негативно окрашенные слова, такие как “uncomfortable” (неудобно) и “frustrating” (разочаровывает). Однако есть и позитивные слова, такие как “captivating” (захватывающий) и “wonderfully” (замечательно).

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

from collections import OrderedDict  # Создаем упорядоченный словарь ordict = OrderedDict(sorted(freqdict.items(), key=lambda item: item[1], reverse=True))  # Игнорируем верхние 10% top10 = int(len(ordict.keys())/10)  # Выводим первые 100 слов из оставшихся 90% print(list(ordict.items())[top10:top10+100])

Словарь vs. список Python, массив NumPy и Pandas DataFrame

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

Словари, наряду со списками и кортежами, — одна из основных и наиболее мощных и гибких структур данных, которые может предложить Python. Однако в последнее время большая часть функциональности словаря может быть заменена Pandas. Это библиотека Python, которая позволяет выполнять большую часть обработки и анализа данных.

Если есть готовые библиотеки, зачем утруждать себя пониманием того, на что способны словари?

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

Такие библиотеки, как Pandas, позволяют работать с данными быстрее и эффективнее. С ними не приходится беспокоиться о том, как хранятся данные. Однако Pandas также использует словари (наряду с другими расширенными структурами данных, такими как массив NumPy) для хранения своих данных. Поэтому, прежде чем начинать работать с Pandas, все же полезно узнать, как работает словарь.

Даже при использовании Pandas иногда рекомендуется использовать словари. Например, когда значения необходимо просто сопоставить, использование объекта Pandas будет неэффективным и излишним.

Наконец, Pandas содержит функции для преобразования словаря в Pandas DataFrame и наоборот. Кроме того, датафреймы могут содержать словари. И то, и другое — очень полезные инструменты для работы с данными.

Заключение

Поздравляем! Вы одолели эту длинную и познавательную статью-руководство по использованию словарей Python на практике. Надеемся, вам было полезно! Успехов в написании кода!

Перевод статьи «Python Dictionary Tutorial».

ispolzovanie slovarej v python na praktike 0a13963 - Использование словарей в Python на практике

Лаборатория Django-разработки

За 3 месяца отработай навыки Django-разработки до профессионального уровня на серьезном проекте под руководством наставника.

Подробнее ×

  • 2 views
  • 0 Comment

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Связаться со мной
Close