Как сделать частотный словарь питон

Обновлено: 08.07.2024

Словарь Python используется для хранения данных в формате пары ключ-значение.

Что такое словарь в Python?

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

  • Ключи должны быть единым элементом.
  • Значение может быть любого типа, например, список, кортеж, целое число и т. д.

Другими словами, мы можем сказать, что словарь – это набор пар ключ-значение, где значением может быть любой объект Python. Напротив, ключи – это неизменяемый объект Python, то есть числа, строка или кортеж.

Создание словаря

Словарь можно создать, используя несколько пар ключ-значение, заключенных в фигурные скобки <>, и каждый ключ отделяется от своего значения двоеточием(:). Синтаксис для определения словаря приведен ниже.

В приведенном выше словаре Dict ключи Name и Age представляют собой строку, которая является неизменяемым объектом.

Давайте посмотрим, как создать словарь и напечатать его содержимое.

Python предоставляет встроенный метод функции dict(), который также используется для создания словаря. Пустые фигурные скобки <> используются для создания пустого словаря.

Доступ к значениям словаря

Мы обсудили, как можно получить доступ к данным в списке и кортеже с помощью индексации.

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

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

Python предоставляет нам альтернативу использованию метода get() для доступа к значениям словаря. Результат будет тот же, что и при индексации.

Добавление значений словаря

Словарь – это изменяемый тип данных, и его значения можно обновлять с помощью определенных ключей. Значение можно обновить вместе с ключом Dict[ключ] = значение. Метод update() также используется для обновления существующего значения.

Примечание. Если пара “ключ-значение” уже присутствует в словаре, значение обновляется. В противном случае новые ключи добавляются в словарь.

Давайте посмотрим на примеры обновления значений словаря:

Удаление элементов с помощью ключевого слова del

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

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

Метод pop() принимает ключ в качестве аргумента и удаляет связанное значение. Рассмотрим следующий пример.

Python также предоставляет встроенные методы popitem() и clear() для удаления элементов из словаря. Popitem() удаляет произвольный элемент из словаря, тогда как метод clear() удаляет все элементы из всего словаря.

Итерационный словарь

Словарь можно повторять с помощью цикла for, как указано ниже.

Свойства ключей словаря

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

Рассмотрим следующий пример:

2. В Python ключ не может быть изменяемым объектом. Мы можем использовать числа, строки или кортежи в качестве ключа, но мы не можем использовать какой-либо изменяемый объект, такой как список, в качестве ключа в словаре.

У местная аналогия для словаря в языке Python — обычный толковый словарь, где каждому отдельному слову (ключу) соответствует его определение (значение).

А теперь разберёмся подробнее, как в Python устроены словари и как с ними работать.

Что такое словарь и как он устроен

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

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

Способ хранения словаря Python в памяти

Рассмотрим сначала то, как выглядит структура отдельно взятого элемента словаря в pycore_dict.h :

  • me_hash — кэшированный хеш-код me_key ;
  • *me_key — указатель на объект, содержащий ключ элемента;
  • *me_value — указатель на объект, содержащий значение элемента.

Теперь перейдем к облику самой C-структуры словаря в Python:

Выходит, что, при объявлении нового словаря, в памяти создается объект, состоящий из следующих блоков:

  • PyObject_HEAD — заголовок;
  • Py_ssize_t ma_used — количество элементов словаря;
  • uint64_t ma_version_tag — уникальная версия словаря, меняющаяся каждый раз при его обновлении;
  • PyDictKeysObject *ma_keys — указатель на массив ключей;
  • PyObject **ma_values — массив указателей на значения ключей. Если ma_values IS NULL, то все пары ключ:значение содержатся в ma_keys.

Как и в случае со списками, объект словаря хранит лишь указатели, а не сами значения

Базовая работа со словарями

Объявление словаря

Объявить словарь Python 3 можно несколькими способами. Но сначала рассмотрим наиболее простую ситуацию и создадим пустой словарь:

Теперь объявим и инициализируем словарь из трех элементов через соответствующий литерал и выведем на экран значение третьего элемента:

Помимо литерального объявления, в Python существует возможность объявлять словари при помощи функции dict() :

inventory_dict = dict(right_hand='sword', left_hand='shield') inventory_dict >

Чуть более хитрые способы создания словарей:

Вариант №1 . Если вам необходим словарь, каждому ключу которого сопоставлено одно и то же значение, то можно воспользоваться методом fromkeys() :

Вариант №2 . С помощью функции-упаковщика zip() , вызванной внутри dict() , вы можете составить словарь из двух списков (в случае несовпадения длин списков, функция самостоятельно отсечет лишние элементы):

key_list = ['marvel_hero', 'dc_hero'] value_list = ['Spiderman', 'Flash'] superhero_dict = dict(zip(key_list, value_list)) superhero_dict >

Обращение к элементу словаря в Python

Извлечь значение элемента словаря можно единственным образом — обратившись к нему по его ключу:

В отличие от списков, номеров позиций в словарях нет:

print(any_dict[1]) > Traceback (most recent call last): File "

", line 1, in print(any_dict[1]) NameError: name 'any_dict' is not defined

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

Добавление нового элемента в словарь

Для того чтобы добавить в словарь новые данные достаточно новому ключу этого словаря назначить какое-либо значение. Добавление выглядит так:

superhero_dict = superhero_dict['dark_horse_hero'] = 'Hellboy' print(superhero_dict) >

Аналогичным образом можно произвести замену существующего значения по его ключу:

superhero_dict['dc_hero'] = 'Batwoman' print(superhero_dict) >

Удаление элемента из словаря

Для того чтобы удалить запись в словаре воспользуемся оператором del :

Проверка на наличие ключа в словаре Python

Как отмечалось выше, обращение по несуществующему ключу вызывает ошибку в работе интерпретатора. Поэтому, наличие ключа в словаре следует проверять. За это дело отвечает оператор in :

💡 Кстати говоря, использование метода get() позволяет корректно обработать ситуацию, когда запрашивается значение по несуществующему ключу. Достаточно в качестве второго параметра написать значение по умолчанию:

my_hero = superhero_dict.get('dark_horse_hero', 'Этот ключ в словаре отсутствует!') print(my_hero) > Этот ключ в словаре отсутствует!

Длина словаря в Python

Стоит помнить, что словарь — это лишь набор отображений, а не последовательность, однако количество записей в нём мы все еще можем получить, воспользовавшись функцией len() :

treasure = dict(t1='gold', t2='necklace') num_of_items = len(treasure) print(num_of_items) > 2

Не самая богатая добыча! 🙄

Сортировка словаря

Так как словарь состоит из пар, то и отсортировать его можно, как по ключам, так и по значениям.

Сортировка по ключу Сортировка по ключам выполняется с использованием функции sorted() . Работает функция так:

statistic_dict = for key in sorted(statistic_dict): print(key) > a b с d e

Сортировка по значению А вот — один из вариантов сортировки словаря по значениям:

elements = for key, val in sorted(elements.items(), key= lambda x: x[1]): print(val) > -2 0 1 13 95

👉 Здесь стоит учитывать, что, сама по себе, запись sorted(elements.items(), key= lambda x: x[1]) будет возвращать не словарь, а отсортированный список кортежей. Поэтому более правильным вариантом будет:

Перебор словаря в Python

Не является великой тайной и тот факт, что словарь, являющийся, по сути своей, набором пар (т.е. коллекцией), можно всячески итерировать. Один из способов — перебор по ключам:

iter_dict = for key in iter_dict: print(key, end=' ') > key_b key_d key_e key_c key_a

Другой способ — проитерировать с использованием метода .items() . В этом случае на каждой итерации, пара ключ:значение будет возвращаться к нам в виде кортежа (‘ключ’, значение):

iter_dict = for item in iter_dict.items(): print(item, end=' ') > ('key_b', 1) ('key_d', 0) ('key_e', -2) ('key_c', 95) ('key_a', 13)

Наконец, мы можем перебрать значения словаря, пользуясь классным методом .values() :

Объединение словарей

Когда заходит речь об объединении двух словарей, то обязательно следует упомянуть, что для пары сущностей типа "словарь" оператор "+"не определен. Причина этого становится довольно очевидной — стоит лишь вспомнить, что словарь не является последовательностью, а также задуматься над тем, какая именно операция на множестве словарей должна быть реализована этим самым оператором "+". Поэтому как-то так:

dict_1 = dict_2 = print(dict_1 + dict_2) Traceback (most recent call last): File "test.py", line 4, in print(dict_1 + dict_2) TypeError: unsupported operand type(s) for +: 'dict' and 'dict'

Ну а если вы всё-таки хотите добиться результата и всё же выполнить объединение двух словарей, то достаточно воспользоваться методом .update() :

💭 Если бы showcase_2 содержал ключи, присутствующие в showcase_1, то значения, ассоциированные с этими ключами, в результирующем словаре были бы взяты именно из showcase_2.

Ограничения

Создавая словарь, вы не должны забывать о некоторых ограничениях, накладываемых, в основном, на его ключи.

  • Данные, представляющие собой ключ словаря, должны быть уникальны внутри множества ключей этого словаря. Проще говоря, не должно быть двух одинаковых ключей;
  • Ключ должен быть объектом неизменяемого типа, то есть строкой, числом или кортежем. Если говорить строже, то объект содержащий ключ должен быть hashable. То есть иметь хеш-значение, которое не меняется в течение его жизненного цикла;
  • На значения нет никаких ограничений. Максимальный уровень свободы. Они не обязаны быть ни уникальными, ни неизменяемыми, поэтому могут себе позволить быть какими угодно.

Методы словарей в Python

Перечислим основные словарные методы, которые помогут вам при работе с этим типом данных.

  • clear() — очищает заданный словарь, приводя его к пустому.
  • get() — отдаёт значение словаря по указанному ключу. Если ключ не существует, а в качестве дополнительного аргумента передано значение по умолчанию, то метод вернет его. Если же значение по умолчанию опущено, метод вернет None.
  • items() — возвращает словарные пары ключ:значение, как соответствующие им кортежи.
  • keys() — возвращает ключи словаря, организованные в виде списка.
  • values() — подобным образом, возвращает список значений словаря.
  • pop() — удалит запись словаря по ключу и вернет её значение.
  • popitem() — выбрасывает пару ключ:значение из словаря и возвращает её в качестве кортежа. Такие пары возвращаются в порядке LIFO.
  • update() — реализует своеобразную операцию конкатенации для словарей. Он объединяет ключи и значения одного словаря с ключами и значениями другого. При этом если какие-то ключи совпадут, то результирующим значением станет значение словаря, указанного в качестве аргумента метода update.
  • copy() — создает полную копию исходного словаря.

Приведение Python-словарей к другим типам

dict to json

Чтобы сериализовать словарь в json формат, сперва необходимо импортировать сам модуль json:

Теперь можно развлекаться. Существует два схожих метода:

  • dump() позволит вам конвертировать питоновские словари в json объекты и сохранять их в файлы на вашем компьютере. Это несколько напоминает работу с csv.
  • dumps() запишет словарь в строку Python, но согласно json-формату.

dict to list

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

medicine_chest = dict(top_part='potion', bot_part='bandage') medicine_list = [] for key, con in medicine_chest.items(): temp = Как сделать частотный словарь питон medicine_list.append(temp) print(medicine_list) > [['top_part', 'potion'], ['bot_part', ' bandage']]

dict to string

Как указывалось выше, привести словарь к строке (str) можно при помощи модуля json . Но, если словарь не слишком большой, то эквивалентного результата можно добиться, используя стандартную функцию str() :

food_machine = dict(tier_1='juice', tier_2='chocolate') f_machine_str = str(food_machine) print(f_machine_str) >

Генератор словарей

В Python существует возможность создавать словари с помощью генераторов. Генераторы выполняют цикл, отбирают key:value пары на каждой итерации и заполняют, таким образом, новый словарь.

Создадим словарь, где нескольким элементам ряда натуральных чисел приводятся в соответствие их квадраты:

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

list_of_keys = ['q', 'w', 'e', 'r', 't'] generated_dict = print(generated_dict) >

Вложенные словари

Отдельного упоминания заслуживает тот факт, что элемент словаря может принимать в качестве значения другой словарь:

💭 Число уровней вложенности словарей неограниченно!

Альтернативы словарям

Есть такой модуль, который называется collections . В нем представлены альтернативные словарям типы данных: OrderedDict , defaultdict и Counter . Они близки словарям по сути, но имеют несколько расширенный функционал.

OrderedDict

OrderedDict, можно сказать, является обычным словарем, который, однако, запоминает порядок добавления в него ключей. А, значит, у метода popitem() появляется возможность, через присвоение параметру last значений False или True , указывать какой элемент нужно удалить: первый или последний.

defaultdict

Это подмножество словарей также, на первый взгляд, очень похоже на обычный dict. Но и тут есть свои тонкости. В частности, defaultdict , при отсутствии ключа, всегда присваивает значение по умолчанию, если его пытаются извлечь. Соответственно, KeyError вы больше не увидите.

Counter

Counter — подтип словаря, подсчитывающий и хранящий количество совпадающих неизменяемых элементов последовательности. Однако Counter() обладает и своими небезынтересными методами:

  • elements() — метод возвращает список элементов в лексикографическом порядке;
  • most_common(num) — возвращает num элементов, которые встречаются в последовательности чаще всего;
  • subtract() — метод вычитает количество элементов, присутствующих в итерируемом или map объекте из вычисляемого объекта.

Наверно вы заметили, что словари и списки (о которых, кстати, вы можете почитать в нашей предыдущей статье " Списки в Python ") схожи как, внешне, так и в том, что могут изменять свой размер по необходимости.

Вообще говоря, и списки и словари — это изменяемые объекты, однако операции, провоцирующие изменения для этих типов данных, различны. Различаются они ещё и тем, что элементы словарей сохраняются по ключам, а не по позициям. Так или иначе, оба типа коллекций входят в число наиболее важных и часто применяемых на практике в языке Python.

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

Создание словаря

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

Следующие примеры показывают, как создавать словари Python:

Создание пустого словаря:

Cловарь, где ключи являются целыми числами:

Создание словаря с ключами разных типов:

Можно также создать словарь, явно вызвав метод dict() :

Словарь можно создать с помощью последовательности, как в примере внизу:

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

Чтобы вывести содержимое словаря, можно использовать функцию print() и передать название словаря в качестве аргумента. Например:

Доступ к элементами

Чтобы получить доступ к элементам словаря, нужно передать ключ в квадратных скобках [] . Например:

Был создан словарь dict_sample . Затем была создана переменная x . Ее значение — это значение ключа ["model"] из словаря.

Вот другой пример:

Объект словаря также имеет функцию get() , которой можно пользоваться для доступа к элементам словаря. Ее нужно добавлять к словаря через точку и затем передавать название ключа как аргумент функции. Например:

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

Добавление элементов

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

У нового элемента ключ "Capacity" и значение — "180CC" . Он был добавлен в качестве первого элемента словаря.

Вот другой пример. Для начала нужно создать пустой словарь:

Словарь ничего не возвращает, потому что в нем ничего не хранится. Добавим в нему элементы, один за одним:

Для добавления элементов были отдельно указаны ключи и соответствующие значения. Например:

В этом примере 0 является ключом, а "Apples" — значение.

Можно даже добавить несколько значений для одного ключа. Например:

В этом примере название ключа — "Value" , а все что после знака = — его значения в формате множества ( Set ).

Помимо добавления новых элементов в словарь, их можно обновлять или изменять. Об этом в следующем разделе.

Обновление элементов

После добавления значения в словарь существующий элемент словаря можно изменить. Для изменения значения используется соответствующий ключ. Например:

В этом примере видно, что было обновлено значение ключа "year" с 2012 на 2014 .

Удаление элементов

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

Ключевое слово del можно использовать для удаления элемента с конкретным ключом. Например:

Вызывается ключевое слово del , а следом за ним — название словаря. В квадратных скобках следом за словарем идет ключ элемента, который требуется удалить. В этом примере это "year" . Запись "year" удаляется из словаря.

Другой способ удалить пару ключ-значение — функция pop() с ключом записи в виде аргумента. Например:

Функция pop() была вызвана добавлением ее к названию словаря. В этом случае будет удалена запись с ключом "year" .

Функция popitem() удаляет последний элемент в словаре. Для нее не нужно указывать конкретный ключ. Примеры:

Последней записью в словаре была "year" . Она пропала из словаря после вызова функции popitem() .

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

Код вернет ошибку, потому что функция print() пытается получить доступ к словарю, который уже не существует.

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

Код вернет пустой словарь, поскольку все его элементы уже удалены.

Другие распространенные методы словарей

Метод len()

С помощью этого метода можно посчитать количество элементов в словаре. Например:

В этом словаре три записи, поэтому метод вернет 3.

Метод copy()

Этот метод возвращает копию существующего словаря. Например:

Была создана копия словаря dict_sample . Она присвоена переменной x . Если вывести x в консоль, то в ней будут те же элементы, что и в словаре dict_sample .

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

Метод items()

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

Этот метод нужно вызывать вместе со словарем, как в примере ниже:

Объект, который возвращает items() , можно использовать, чтобы показать изменения в словаре. Вот как это работает.

Вывод демонстрирует, что когда вы меняете значение в словаре, объекты элементов также обновляются.

Метод fromkeys()

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

Значение требуемого параметра keys — итерируемые объекты. Оно отвечает за ключи нового словаря. Значение для параметра value указывать необязательно. Оно отвечает за значение по умолчанию для всех ключей. По умолчанию — None .

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

В коде вверху определены ключи и одно значение. Метод fromkeys() перебирает ключи и объединяет их со значением для создания заполненного словаря.

Значение для параметра keys является обязательным. В следующем примере показано, что происходит, если параметр values не определен:

Используется значение по умолчанию, None .

Метод setdefault()

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

У метода следующий синтаксис:

В этой функции параметр keyname является обязательным. Он обозначает название ключа, значение которого нужно вернуть. Параметр value необязательный. Если в словаре уже есть ключ, параметр не будет иметь никакого эффекта. Если ключ не существует, тогда значение функции станет значением ключа. Значение по умолчанию — None .

В словаре нет ключа color . Метод setdefault() вставляет этот ключ вместе со значением "Gray" .

Следующий пример показывает, как работает метод, если такой ключ уже есть:

Значение "Allion" не повлияло на словарь, потому что у ключа уже есть значение.

Метод keys()

Этот метод также возвращает итерируемый объект. Он является списком всех ключей в словаре. Как и метод items() , этот отображает изменения в самом словаре.

Для использования метода нужно всего лишь использовать его с именем словаря, как показано ниже:

Часто этот метод используется, чтобы перебрать все ключи в словаре:

Выводы

Обложка: Словари и их методы в Python

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

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

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

Получение данных из словаря

Для получения значения конкретного ключа используются квадратные скобки [] . Предположим, что в нашем словаре есть пара 'марафон': 26 .

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

Добавление и обновление ключей

Добавление новых пар в словарь происходит достаточно просто:

Обновление существующих значений происходит абсолютно также:

Удаление ключей

Для удаления ключа и соответствующего значения из словаря можно использовать del

Методы

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

Update

Метод update() пригодится, если нужно обновить несколько пар сразу. Метод принимает другой словарь в качестве аргумента.

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

Метод get() возвращает значение по указанному ключу. Если указанного ключа не существует, метод вернёт None .

Метод можно использовать для проверки наличия ключей в словаре:

Также можно указать значение по умолчанию, которое будет возвращено вместо None , если ключа в словаре не окажется:

Метод pop() удаляет ключ и возвращает соответствующее ему значение.

Метод keys() возвращает коллекцию ключей в словаре.

Values

Метод values() возвращает коллекцию значений в словаре.

Items

Итерация через словарь

Вы можете провести итерацию по каждому ключу в словаре.

Очевидно, вместо story_count можно использовать story_count.keys() .

Читайте также: