Словари и их методы в Python
Что такое словарь
Словарь — неупорядоченная структура данных, которая позволяет хранить пары «ключ — значение». Вот пример словаря на Python:
dictionary = {'персона': 'человек', 'марафон': 'гонка бегунов длиной около 26 миль', 'противостоять': 'оставаться сильным, несмотря на давление', 'бежать': 'двигаться со скоростью'}
Данный словарь использует строки в качестве ключей, однако ключом может являться в принципе любой неизменяемый тип данных. Значением же конкретного ключа может быть что угодно. Вот ещё один пример словаря, где ключами являются числа, а значениями — строки:
gender_dict = {0: 'муж', 1: 'жен'}
Важное уточнение: если вы попробуете использовать изменяемый тип данных в качестве ключа, то получите ошибку:
dictionary = {(1, 2.0): 'кортежи могут быть ключами', 1: 'целые числа могут быть ключами', 'бежать': 'строки тоже', ['носок', 1, 2.0]: 'а списки не могут'}
Прим. перев. На самом деле проблема не с изменяемыми, а с нехэшируемыми типами данных, но обычно это одно и то же.
Получение данных из словаря
Для получения значения конкретного ключа используются квадратные скобки []
. Предположим, что в нашем словаре есть пара 'марафон': 26
.
# берём значение с ключом "марафон" dictionary['марафон']
Опять же, вы получите ошибку, если попытаетесь получить значение по несуществующему ключу. Для избежания подобных ошибок существуют методы, о которых мы сейчас поговорим.
Добавление и обновление ключей
Добавление новых пар в словарь происходит достаточно просто:
# Добавляем ключ "туфля" со значением "род обуви, закрывающей ногу не выше щиколотки" dictionary['туфля'] = 'род обуви, закрывающей ногу не выше щиколотки'
Обновление существующих значений происходит абсолютно также:
# Обновляем ключ "туфля" и присваиваем ему значение "хорошая туфля" dictionary['туфля'] = 'хорошая туфля'
Удаление ключей
Для удаления ключа и соответствующего значения из словаря можно использовать del
# Удаляем значение с ключом "противостоять" из словаря del dictionary['противостоять']
Методы
Словари в Python имеют множество различных полезных методов, которые помогут вам в работе с ними. Вот лишь некоторые из них:
Update
Метод update()
пригодится, если нужно обновить несколько пар сразу. Метод принимает другой словарь в качестве аргумента.
# Добавляем две пары в словарь dictionary, используя метод update dictionary.update({'бежал': 'бежать в прошедшем времени', 'туфли': 'туфля во множественном числе'})
>>> dictionary {'марафон': 'гонка бегунов длиной около 26 миль', 'персона': 'человек', 'бежал': 'бежать в прошедшем времени', 'бежать': 'двигаться со скоростью', 'туфля': 'род обуви, закрывающей ногу не выше щиколотки', 'туфли': 'туфля во множественном числе'}
Если вас интересует, почему данные в словаре расположены не в том порядке, в котором они были внесены в него, то это потому что словари не упорядочены.
Get
# Допустим, у нас есть словарь story_count story_count = {'сто': 100, 'девяносто': 90, 'двенадцать': 12, 'пять': 5}
Метод get()
возвращает значение по указанному ключу. Если указанного ключа не существует, метод вернёт None
.
# Ключ "двенадцать" существует и метод get в данном случае вернёт 12 story_count.get('двенадцать')
Метод можно использовать для проверки наличия ключей в словаре:
>>> story_count.get('два') None
Также можно указать значение по умолчанию, которое будет возвращено вместо
, если ключа в словаре не окажется:
# Метод вернёт 0 в случае, если данного ключа не существует story_count.get('два', 0)
Pop
Метод pop()
удаляет ключ и возвращает соответствующее ему значение.
>>> story_count.pop('девяносто') 90 >>> story_count {'двенадцать': 12, 'сто': 100, 'пять': 5}
Keys
Метод keys()
возвращает коллекцию ключей в словаре.
>>> story_count.keys() ['сто', 'пять', 'двенадцать']
Values
Метод values()
возвращает коллекцию значений в словаре.
>>> story_count.values() [100, 12, 5]
Items
Метод items()
возвращает пары «ключ — значение».
>>> dictionary.items() [('персона', 'человек'), ('бежать', 'двигаться со скоростью'), ('туфля', 'род обуви, закрывающей ногу не выше щиколотки'), ('бежал', 'бежать в прошедшем времени'), ('марафон', 'гонка бегунов длиной около 26 миль'), ('туфли', 'туфля во множественном числе')]
Итерация через словарь
Вы можете провести итерацию по каждому ключу в словаре.
for key in story_count: print(key)
Очевидно, вместо story_count
можно использовать
.
В примере кода ниже цикл for
использует метод items()
для получения пары «ключ — значение» на каждую итерацию.
>>> for key, value in dictionary.items(): print(key, value) ('персона', 'человек') ('бежать', 'двигаться со скоростью') ('туфля', 'род обуви, закрывающей ногу не выше щиколотки') ('бежал', 'бежать в прошедшем времени') ('марафон', 'гонка бегунов длиной около 26 миль') ('туфли', 'туфля во множественном числе')
О словаре и других типах данных Python можно почитать в нашей статье.
Перевод статьи «Python Dictionary and Dictionary Methods»
Работа со словарями Python — шпаргалка для начинающих
- Словари и инструменты для работы с данными Python
- Как создать словарь в Python
- Как добавить данные в словарь Python?
- Как отфильтровать словарь Python
- Операции над словарями Python
- Как происходит сортировка словаря Python?
- Сравнение словарей со списками Python, массивами NumPy и Pandas DataFrames
В этом руководстве мы рассмотрим следующие темы:
- как создать словарь, используя фигурные скобки и двоеточия;
- как загрузить данные в словарь с помощью библиотек urllib и random;
- как фильтровать словарь с помощью цикла for и специальных итераторов для перебора ключей и значений словаря;
- как выполнять операции со словарем для получения или удаления значений, и как использовать значения словаря для подмножества значений из него;
- как сортировать словарь с помощью библиотеки re и как в этом могут помочь функции OrderedDict и лямбда-функции;
- сравним словари Python со списками, массивами NumPy и Pandas DataFrames.
Предположим, что вы проводите «инвентаризацию» фруктов, которые положили в корзину, сохраняя количество каждого фрукта в словаре. Существует несколько способов создания словаря, но в этом руководстве мы используем самые простые. С остальными можно ознакомиться в документации Python по словарям.
Словари можно распознать по фигурным скобкам {} и разделению двоеточием : ключа и значения для каждого элемента.
Переменная fruit в приведенном ниже коде является допустимым словарем. Получить доступ к элементу Python словаря можно, поместив ключ между квадратными скобками [].Также можно использовать метод .get(), чтобы сделать то же самое:
fruit = {"apple" : 5, "pear" : 3, "banana" : 4, "pineapple" : 1,https://www.datacamp.com/community/tutorials/python-dictionary-tutorial "cherry" : 20} # Получаем доступ к словарю `fruit` непосредственно (без использования get) и выводим значение "banana" print(_____["______"]) # Выбираем один из 5 фруктов и показываем, что оба способа извлечения дают аналогичные результаты print(fruit["_____"] == fruit.get("_____"))
Теперь мы поместим данные во вложенный словарь, который содержит в качестве значения другой словарь, а не строку или целое число. Таким образом, в словарь можно сохранять таблицы или матрицы.
Используемые данные — это отзывы на Amazon о книге Донны Тартт «The Goldfinch». Они были сохранены в простом файле с разделителями. Таблица содержит четыре столбца: оценка, URL-адрес, заголовок отзыва и текст отзыва.
Есть несколько способов представить эти данные в Python словаре, но в нашем случае мы берем URL-адрес в качестве ключа и помещаем другие столбцы в словарь с вложенными значениями:
import urllib 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} # Берем случайный ключ из словаря и выводим его значение
Мы получили набор данных, в котором нет отсутствующих значений. Но можно проверить, присутствуют ли все ключи в словаре, сравнив количество строк из файла с количеством ключей словаря. В нашем случае сортировка словаря Python осуществляется следующим образом:
# Подсчитываем количество строк в файле print("Количество строк: " + str(len(lines))) # Подсчитываем количество ключей в словаре; оно должно равняться количеству строк в файле print("Количество ключей словаря: " + str(len(reviews.keys())))
Теперь, когда отзывы хранятся в словаре, пришло время попробовать выполнить некоторые операции. Допустим, вы хотите посмотреть, что на самом деле написали люди, выбрав только отзывы с оценкой 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: # Convert score to float lowscores.append(key) # Выводим все записи с низкой оценкой for item in __________: print(reviews[____])
Если словарь, содержащий полный набор данных, большой, то разумнее использовать список lowscores, который мы только что скомпилировали, чтобы создать совершенно новый словарь (Python список в словарь). Преимущество этого приема заключается в том, что для дальнейшего анализа не нужно хранить в памяти большой словарь. Можно просто перейти к соответствующему подмножеству исходных данных.
Во-первых, мы используем ключи, хранящиеся в lowscores, для создания нового словаря. Чтобы сделать это, есть два способа: первый — извлекаем только соответствующие элементы из исходного словаря с помощью метода .get(), оставляя исходный словарь без изменений. Второй — использовать метод .pop(), который удаляет извлеченные записи из исходного словаря.
Код для подмножества может выглядеть следующим образом: subset = dict([(k, reviews.get(k)) for k in lowscores]). Такое написание может показаться незнакомым, потому что цикл задан одной строкой кода. Этот стиль называется «генерацией словаря». На самом деле это цикл for, который перебирает элементы lowscores, извлекает значения из отзывов и использует их для заполнения нового словаря.
Вы можете сравнить традиционный стиль с использованием цикла и генерацию словаря и убедиться, что они действительно дают идентичный результат:
# Метод с использованием цикла for для создания подмножества словаря forloop = {} for k in lowscores: forloop[k] = reviews[k] # Добавляем специальный метод извлечения релевантных элементов из словаря `reviews` dictcomp = {k : reviews. ___(k) for k in lowscores} # Удостоверимся, что эти объекты аналогичны print(forloop == ________)
Предположим, что теперь вы хотите изменить словарь Python 3, чтобы оценки выступали в качестве ключей словаря, а не идентификаторов. Можно использовать для этого цикл 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[_____['_____']]. append(newvalues) # Выводим ключи словаря, чтобы удостовериться, что это на самом деле оценки из отзывов print(scoredict.keys())
Мы попробовали загрузить в словарь реальный набор данных, теперь можно выполнить их простой анализ. Если вы хотите знать, что именно пишут люди, ставящие низкую оценку роману, можно провести сортировку словаря Python, создав список частоты использования слов в отрицательных отзывах (оценка 1.0).
Нам нужно немного обработать текст отзывов, удалив HTML-теги и конвертировав заглавные буквы в словах в нижний регистр. Для первой задачи мы используем регулярное выражение, которое удаляет все теги: re.sub(«», «»). Регулярные выражения — это полезный инструмент при работе с текстовыми данными. Они довольно сложны для компиляции и заслуживают отдельного руководства.
Но в нашем примере нужно просто определить наборы символов, которые начинаются с символа <, за которым следует произвольное количество символов, после чего стоит символ >. И заменить их на пустые кавычки «» (ничего).
Python содержит встроенную функцию для удаления заглавных букв из слов, нужно просто привязать функцию .lowercase() к строке. Таким образом, можно избавиться от слов, начинающихся с заглавной буквы, которые встречаются в начале предложений.
Затем мы создаем частотный словарь, используя defaultdict вместо обычного словаря. Это гарантирует, что каждый «ключ» уже инициализирован, и можно просто увеличивать его частоту, начиная с 1.
Если вы не используете defaultdict, Python может выдать ошибку при первом увеличении частоты (с 0 до 1), потому что ключ еще не существует. Этого можно избежать, предварительно проверив, существует ли ключ в Python словаре, прежде чем увеличивать значение его частоты. Но это решение не такое элегантное, как defaultdict:
import re # Импортируем defaultdict from collections import ___________ freqdict = defaultdict(int) for item in lowscores: review = reviews[item]["review"] cleantext = re.sub(r'<.*?>', '', review).strip(). split() # Remove HTML tags and split the review by word (space separated) for word in cleantext: # Конвертируем все буквы в нижний регистр word = word.lower() # Заполняем следующую строку, чтобы увеличить частоту на один: freqdict[word] += _ print(freqdict)
После того, как наш частотный словарь будет готов, все равно нужно будет осуществить сортировку словаря Python по значению в порядке убывания, чтобы быстро увидеть, какие слова употребляются чаще всего. Поскольку стандартные словари (в том числе defaultdict) не могут быть отсортированы определенным образом, нужно использовать другой класс, а именно OrderedDict. Он хранит элементы словаря в порядке их добавления. В этом случае сначала нужно отсортировать элементы, прежде чем сохранять их снова в класс OrderedDict.
Функция sorted принимает три аргумента. Первый — это объект, который нужно отсортировать, наш частотный словарь. При этом необходимо помнить, что доступ к парам ключ-значение в словаре возможен только через функцию . items(). Если вы забудете об этом, Python даже не выдаст предупреждение, а только вернет первый ключ, который встретит. Другими словами: если вы перебираете словарь, и ваш код ведет себя странным образом, проверьте, добавлена ли функция .items().
Второй аргумент указывает, какую часть первого аргумента следует использовать для сортировки: key=lambda item: item[1]. Но вам придется более углубленно изучить язык Python, чтобы понять, что это такое. Первая часть довольно понятна: вы хотите, чтобы ключи сортировались.
Но что там делает lambda? Она является анонимной функцией, то есть это функция без имени, которая не может быть вызвана извне. Это альтернативный способ обработки через цикл целого ряда объектов с помощью одной функции. В данном случае используется значение словаря (item[1], при item[0] выступающем в качестве ключа) в качестве аргумента для сортировки.
Третий (последний) аргумент, reverse, указывает, должна ли сортировка выполняться по возрастанию (по умолчанию) или по убыванию. В данном случае мы хотим увидеть наиболее часто встречающиеся слова вверху и указываем reverse=True.
Прямо сейчас вы были бы разочарованы словами, которые располагаются в самом верху списка отсортированных элементов. Это были бы просто «функциональные слова», такие как «the», «and», «a» и т. д. В английском, как и во многих других языках, эти слова употребляются достаточно часто. Но при этом они совершенно бессмысленны сами по себе.
В текстовой аналитике для удаления этих высокочастотных слов используются так называемые стоп-листы. Мы же применим более примитивный подход, игнорируя верхние 10% слов и рассматривая только слова, которые относятся к остальным 90%. Вы увидите, что в верхней части списка представлены как слова с негативным оттенком, такие как «неинтересно» и «разочаровывающе», так и более позитивные: «увлекательно» и «чудесно».
Можно поэкспериментировать и посмотреть, в каких частях Python словаря можно найти интересные слова:
from collections import OrderedDict # Создаем словарь Ordered 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])
Словари — важная структура данных Python, позволяющая поместить данные в объекты для дальнейшей обработки. Они, наряду со списками и кортежами, являются одной из основных, наиболее мощных и гибких структур данных Python. Но в последнее время большая часть функциональных возможностей словаря может быть заменена и заменяется Pandas, библиотекой анализа данных Python. Она позволяет лучше обрабатывать и анализировать данные на Python, и при этом не нужно использовать сторонние специализированные языки статистического программирования (в частности, R).
Такие библиотеки, как Pandas, позволяют обработчикам данных работать быстрее и эффективнее. Им больше не нужно беспокоиться о деталях более низкого уровня, касающихся того, как хранятся данные. Но Pandas также использует словари (наряду с другими расширенными структурами данных, такими как массив NumPy) для хранения данных.
Даже при применении Pandas иногда рекомендуется использовать словари. Например, когда значения необходимо просто сопоставить, и вам не нужны функции Pandas ни для чего другого. Использование объекта Pandas в таких случаях просто неэффективно и излишне.
Pandas включает в себя функции для преобразования словаря в Pandas DataFrame, и наоборот, а DataFrame может осуществлять Python сортировку словаря. Оба они действительно являются полезными частями современного инструментария.
Пожалуйста, оставьте ваши мнения по текущей теме материала. За комментарии, подписки, дизлайки, лайки, отклики огромное вам спасибо!
Пожалуйста, оставляйте ваши отзывы по текущей теме материала. За комментарии, лайки, дизлайки, отклики, подписки низкий вам поклон!
Вадим Дворниковавтор-переводчик статьи «Python Dictionary Tutorial»
Работа со словарями Python — шпаргалка для начинающих
- Словари и инструменты для работы с данными Python
- Как создать словарь в Python
- Как добавить данные в словарь Python?
- Как отфильтровать словарь Python
- Операции над словарями Python
- Как происходит сортировка словаря Python?
- Сравнение словарей со списками Python, массивами NumPy и Pandas DataFrames
При работе с Python все время нужно временно хранить данные для их последующей обработки в соответствующей структуре данных. Язык предоставляет для этого специальную структуру данных — Python словари. В них можно получить доступ к фрагменту данных или значений с помощью ключа (слова), который у нас есть.
В этом руководстве мы рассмотрим следующие темы:
- как создать словарь, используя фигурные скобки и двоеточия;
- как загрузить данные в словарь с помощью библиотек urllib и random;
- как фильтровать словарь с помощью цикла for и специальных итераторов для перебора ключей и значений словаря;
- как выполнять операции со словарем для получения или удаления значений, и как использовать значения словаря для подмножества значений из него;
- как сортировать словарь с помощью библиотеки re и как в этом могут помочь функции OrderedDict и лямбда-функции;
- сравним словари Python со списками, массивами NumPy и Pandas DataFrames.
Предположим, что вы проводите «инвентаризацию» фруктов, которые положили в корзину, сохраняя количество каждого фрукта в словаре. Существует несколько способов создания словаря, но в этом руководстве мы используем самые простые. С остальными можно ознакомиться в документации Python по словарям.
Словари можно распознать по фигурным скобкам {} и разделению двоеточием : ключа и значения для каждого элемента.
Переменная fruit в приведенном ниже коде является допустимым словарем. Получить доступ к элементу Python словаря можно, поместив ключ между квадратными скобками [].Также можно использовать метод .get(), чтобы сделать то же самое:
fruit = {"apple" : 5, "pear" : 3, "banana" : 4, "pineapple" : 1,https://www.datacamp.com/community/tutorials/python-dictionary-tutorial "cherry" : 20} # Получаем доступ к словарю `fruit` непосредственно (без использования get) и выводим значение "banana" print(_____["______"]) # Выбираем один из 5 фруктов и показываем, что оба способа извлечения дают аналогичные результаты print(fruit["_____"] == fruit.get("_____"))
Теперь мы поместим данные во вложенный словарь, который содержит в качестве значения другой словарь, а не строку или целое число. Таким образом, в словарь можно сохранять таблицы или матрицы.
Используемые данные — это отзывы на Amazon о книге Донны Тартт «The Goldfinch». Они были сохранены в простом файле с разделителями. Таблица содержит четыре столбца: оценка, URL-адрес, заголовок отзыва и текст отзыва.
Есть несколько способов представить эти данные в Python словаре, но в нашем случае мы берем URL-адрес в качестве ключа и помещаем другие столбцы в словарь с вложенными значениями:
import urllib 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} # Берем случайный ключ из словаря и выводим его значение
Мы получили набор данных, в котором нет отсутствующих значений. Но можно проверить, присутствуют ли все ключи в словаре, сравнив количество строк из файла с количеством ключей словаря. В нашем случае сортировка словаря Python осуществляется следующим образом:
# Подсчитываем количество строк в файле print("Количество строк: " + str(len(lines))) # Подсчитываем количество ключей в словаре; оно должно равняться количеству строк в файле print("Количество ключей словаря: " + str(len(reviews.keys())))
Теперь, когда отзывы хранятся в словаре, пришло время попробовать выполнить некоторые операции. Допустим, вы хотите посмотреть, что на самом деле написали люди, выбрав только отзывы с оценкой 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: # Convert score to float lowscores.append(key) # Выводим все записи с низкой оценкой for item in __________: print(reviews[____])
Если словарь, содержащий полный набор данных, большой, то разумнее использовать список lowscores, который мы только что скомпилировали, чтобы создать совершенно новый словарь (Python список в словарь). Преимущество этого приема заключается в том, что для дальнейшего анализа не нужно хранить в памяти большой словарь. Можно просто перейти к соответствующему подмножеству исходных данных.
Во-первых, мы используем ключи, хранящиеся в lowscores, для создания нового словаря. Чтобы сделать это, есть два способа: первый — извлекаем только соответствующие элементы из исходного словаря с помощью метода .get(), оставляя исходный словарь без изменений. Второй — использовать метод .pop(), который удаляет извлеченные записи из исходного словаря.
Код для подмножества может выглядеть следующим образом: subset = dict([(k, reviews.get(k)) for k in lowscores]). Такое написание может показаться незнакомым, потому что цикл задан одной строкой кода. Этот стиль называется «генерацией словаря». На самом деле это цикл for, который перебирает элементы lowscores, извлекает значения из отзывов и использует их для заполнения нового словаря.
Вы можете сравнить традиционный стиль с использованием цикла и генерацию словаря и убедиться, что они действительно дают идентичный результат:
# Метод с использованием цикла for для создания подмножества словаря forloop = {} for k in lowscores: forloop[k] = reviews[k] # Добавляем специальный метод извлечения релевантных элементов из словаря `reviews` dictcomp = {k : reviews. ___(k) for k in lowscores} # Удостоверимся, что эти объекты аналогичны print(forloop == ________)
Предположим, что теперь вы хотите изменить словарь Python 3, чтобы оценки выступали в качестве ключей словаря, а не идентификаторов. Можно использовать для этого цикл 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[_____['_____']]. append(newvalues) # Выводим ключи словаря, чтобы удостовериться, что это на самом деле оценки из отзывов print(scoredict.keys())
Мы попробовали загрузить в словарь реальный набор данных, теперь можно выполнить их простой анализ. Если вы хотите знать, что именно пишут люди, ставящие низкую оценку роману, можно провести сортировку словаря Python, создав список частоты использования слов в отрицательных отзывах (оценка 1.0).
Нам нужно немного обработать текст отзывов, удалив HTML-теги и конвертировав заглавные буквы в словах в нижний регистр. Для первой задачи мы используем регулярное выражение, которое удаляет все теги: re.sub(«», «»). Регулярные выражения — это полезный инструмент при работе с текстовыми данными. Они довольно сложны для компиляции и заслуживают отдельного руководства.
Но в нашем примере нужно просто определить наборы символов, которые начинаются с символа <, за которым следует произвольное количество символов, после чего стоит символ >. И заменить их на пустые кавычки «» (ничего).
Python содержит встроенную функцию для удаления заглавных букв из слов, нужно просто привязать функцию .lowercase() к строке. Таким образом, можно избавиться от слов, начинающихся с заглавной буквы, которые встречаются в начале предложений.
Затем мы создаем частотный словарь, используя defaultdict вместо обычного словаря. Это гарантирует, что каждый «ключ» уже инициализирован, и можно просто увеличивать его частоту, начиная с 1.
Если вы не используете defaultdict, Python может выдать ошибку при первом увеличении частоты (с 0 до 1), потому что ключ еще не существует. Этого можно избежать, предварительно проверив, существует ли ключ в Python словаре, прежде чем увеличивать значение его частоты. Но это решение не такое элегантное, как defaultdict:
import re # Импортируем defaultdict from collections import ___________ freqdict = defaultdict(int) for item in lowscores: review = reviews[item]["review"] cleantext = re.sub(r'<.*?>', '', review).strip(). split() # Remove HTML tags and split the review by word (space separated) for word in cleantext: # Конвертируем все буквы в нижний регистр word = word.lower() # Заполняем следующую строку, чтобы увеличить частоту на один: freqdict[word] += _ print(freqdict)
После того, как наш частотный словарь будет готов, все равно нужно будет осуществить сортировку словаря Python по значению в порядке убывания, чтобы быстро увидеть, какие слова употребляются чаще всего. Поскольку стандартные словари (в том числе defaultdict) не могут быть отсортированы определенным образом, нужно использовать другой класс, а именно OrderedDict. Он хранит элементы словаря в порядке их добавления. В этом случае сначала нужно отсортировать элементы, прежде чем сохранять их снова в класс OrderedDict.
Функция sorted принимает три аргумента. Первый — это объект, который нужно отсортировать, наш частотный словарь. При этом необходимо помнить, что доступ к парам ключ-значение в словаре возможен только через функцию . items(). Если вы забудете об этом, Python даже не выдаст предупреждение, а только вернет первый ключ, который встретит. Другими словами: если вы перебираете словарь, и ваш код ведет себя странным образом, проверьте, добавлена ли функция .items().
Второй аргумент указывает, какую часть первого аргумента следует использовать для сортировки: key=lambda item: item[1]. Но вам придется более углубленно изучить язык Python, чтобы понять, что это такое. Первая часть довольно понятна: вы хотите, чтобы ключи сортировались.
Но что там делает lambda? Она является анонимной функцией, то есть это функция без имени, которая не может быть вызвана извне. Это альтернативный способ обработки через цикл целого ряда объектов с помощью одной функции. В данном случае используется значение словаря (item[1], при item[0] выступающем в качестве ключа) в качестве аргумента для сортировки.
Третий (последний) аргумент, reverse, указывает, должна ли сортировка выполняться по возрастанию (по умолчанию) или по убыванию. В данном случае мы хотим увидеть наиболее часто встречающиеся слова вверху и указываем reverse=True.
Прямо сейчас вы были бы разочарованы словами, которые располагаются в самом верху списка отсортированных элементов. Это были бы просто «функциональные слова», такие как «the», «and», «a» и т. д. В английском, как и во многих других языках, эти слова употребляются достаточно часто. Но при этом они совершенно бессмысленны сами по себе.
В текстовой аналитике для удаления этих высокочастотных слов используются так называемые стоп-листы. Мы же применим более примитивный подход, игнорируя верхние 10% слов и рассматривая только слова, которые относятся к остальным 90%. Вы увидите, что в верхней части списка представлены как слова с негативным оттенком, такие как «неинтересно» и «разочаровывающе», так и более позитивные: «увлекательно» и «чудесно».
Можно поэкспериментировать и посмотреть, в каких частях Python словаря можно найти интересные слова:
from collections import OrderedDict # Создаем словарь Ordered 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])
Словари — важная структура данных Python, позволяющая поместить данные в объекты для дальнейшей обработки. Они, наряду со списками и кортежами, являются одной из основных, наиболее мощных и гибких структур данных Python. Но в последнее время большая часть функциональных возможностей словаря может быть заменена и заменяется Pandas, библиотекой анализа данных Python. Она позволяет лучше обрабатывать и анализировать данные на Python, и при этом не нужно использовать сторонние специализированные языки статистического программирования (в частности, R).
Такие библиотеки, как Pandas, позволяют обработчикам данных работать быстрее и эффективнее. Им больше не нужно беспокоиться о деталях более низкого уровня, касающихся того, как хранятся данные. Но Pandas также использует словари (наряду с другими расширенными структурами данных, такими как массив NumPy) для хранения данных.
Даже при применении Pandas иногда рекомендуется использовать словари. Например, когда значения необходимо просто сопоставить, и вам не нужны функции Pandas ни для чего другого. Использование объекта Pandas в таких случаях просто неэффективно и излишне.
Pandas включает в себя функции для преобразования словаря в Pandas DataFrame, и наоборот, а DataFrame может осуществлять Python сортировку словаря. Оба они действительно являются полезными частями современного инструментария.
Пожалуйста, оставьте ваши мнения по текущей теме материала. За комментарии, подписки, дизлайки, лайки, отклики огромное вам спасибо!
Пожалуйста, оставляйте ваши отзывы по текущей теме материала. За комментарии, лайки, дизлайки, отклики, подписки низкий вам поклон!
Вадим Дворниковавтор-переводчик статьи «Python Dictionary Tutorial»
Dictionaries in Python – Real Python
Смотреть сейчас Это руководство содержит соответствующий видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным учебным пособием, чтобы углубить свое понимание: Dictionaries in Python
Python предоставляет еще один составной тип данных, называемый словарем , который похож на список тем, что представляет собой набор объектов.
Вот чему вы научитесь в этом руководстве: Вы познакомитесь с основными характеристиками словарей Python и узнаете, как получать доступ к данным словарей и управлять ими. После того, как вы закончите это руководство, вы должны иметь хорошее представление о том, когда словарь является подходящим типом данных для использования, и как это сделать.
Словари и списки имеют следующие общие характеристики:
- Оба они изменяемы.
- Оба являются динамическими. Они могут увеличиваться и уменьшаться по мере необходимости.
- Оба могут быть вложенными. Список может содержать другой список. Словарь может содержать другой словарь. Словарь также может содержать список и наоборот.
Словари отличаются от списков прежде всего способом доступа к элементам:
- Доступ к элементам списка осуществляется по их положению в списке посредством индексации.
- Доступ к элементам словаря осуществляется с помощью клавиш.
Примите участие в викторине: Проверьте свои знания с помощью нашей интерактивной викторины «Словари Python». По завершении вы получите балл, чтобы вы могли отслеживать свой прогресс в обучении с течением времени:
Пройдите тест »
Определение словаря
Словари— это реализация Python структуры данных, более известной как ассоциативный массив. Словарь состоит из набора пар ключ-значение. Каждая пара ключ-значение сопоставляет ключ со связанным с ним значением.
Вы можете определить словарь, заключив разделенный запятыми список пар ключ-значение в фигурные скобки ( {}
). Двоеточие ( :
) отделяет каждый ключ от связанного с ним значения:
д = { <ключ>: <значение>, <ключ>: <значение>, . . . <ключ>: <значение> }
Следующее определяет словарь, который сопоставляет местоположение с названием соответствующей бейсбольной команды Высшей лиги:
>>>
>>> MLB_team = { ... «Колорадо»: «Скалистые горы», ... «Бостон»: «Ред Сокс», ... "Миннесота": "Близнецы", ... «Милуоки»: «Пивоварки», ... 'Сиэтл' : 'Моряки' ... }Расположение словаря в команде MLB
Вы также можете создать словарь с помощью встроенной функции dict()
. Аргументом dict()
должна быть последовательность пар ключ-значение. Для этого хорошо подходит список кортежей:
д = дикт ([ (<ключ>, <значение>), (<ключ>, <значение), . . . (<ключ>, <значение>) ])
MLB_team
также можно определить следующим образом:
>>>
>>> MLB_team = dict([ ... («Колорадо», «Скалистые горы»), ... ("Бостон", "Ред Сокс"), . .. ("Миннесота", "Близнецы"), ... ("Милуоки", "Пивоварки"), ... («Сиэтл», «Моряки») ... ])
Если значения ключа представляют собой простые строки, их можно указать в качестве аргументов ключевого слова. Итак, вот еще один способ определить MLB_team
:
>>>
>>> MLB_team = дикт( ... Колорадо='Скалистые горы', ... Бостон = "Ред Сокс", ... Миннесота = "Близнецы", ... Милуоки = "Пивоварки", ... Сиэтл='Моряки' ... )
После того, как вы определили словарь, вы можете отобразить его содержимое так же, как и для списка. Все три приведенных выше определения при отображении выглядят следующим образом:
>>>
>>> тип(MLB_team) <класс 'дикт'> >>> MLB_команда {'Колорадо': 'Скалистые горы', 'Бостон': 'Ред Сокс', 'Миннесота': 'Близнецы', «Милуоки»: «Брюэрз», «Сиэтл»: «Моряки»}
Записи в словаре отображаются в том порядке, в котором они были определены. Но это не имеет значения, когда дело доходит до их извлечения. Элементы словаря не доступны по числовому индексу:
>>>
>>> MLB_team[1] Traceback (последний последний вызов): Файл "", строка 1, в MLB_команда[1] Ошибка ключа: 1
Возможно, вы все еще хотите отсортировать свой словарь. Если это так, ознакомьтесь с разделом Сортировка словаря Python: значения, ключи и многое другое.
Удалить рекламу
Доступ к значениям словаря
Разумеется, элементы словаря должны быть каким-то образом доступны. Если вы не получаете их по индексу, то как вы их получаете?
Значение извлекается из словаря путем указания соответствующего ему ключа в квадратных скобках ( []
):
>>>
>>> MLB_team['Миннесота'] 'Двойняшки' >>> MLB_team['Колорадо'] "Скалистые горы"
Если вы ссылаетесь на ключ, которого нет в словаре, Python вызывает исключение:
>>>
>>> MLB_team['Торонто'] Traceback (последний последний вызов): Файл "", строка 1, в MLB_team['Торонто'] KeyError: «Торонто»
Добавление записи в существующий словарь — это просто вопрос назначения нового ключа и значения:
>>>
>>> MLB_team['Канзас-Сити'] = 'Роялз' >>> MLB_команда {'Колорадо': 'Скалистые горы', 'Бостон': 'Ред Сокс', 'Миннесота': 'Близнецы', «Милуоки»: «Брюэрз», «Сиэтл»: «Моряки», «Канзас-Сити»: «Ройалз»}
Если вы хотите обновить запись, вы можете просто присвоить новое значение существующему ключу:
>>>
>>> MLB_team['Сиэтл'] = 'Сихокс' >>> MLB_команда {'Колорадо': 'Скалистые горы', 'Бостон': 'Ред Сокс', 'Миннесота': 'Близнецы', «Милуоки»: «Брюэрз», «Сиэтл»: «Сихокс», «Канзас-Сити»: «Ройалз»}
Чтобы удалить запись, используйте оператор del
, указав ключ для удаления:
>>>
>>> del MLB_team['Сиэтл'] >>> MLB_команда {'Колорадо': 'Скалистые горы', 'Бостон': 'Ред Сокс', 'Миннесота': 'Близнецы', «Милуоки»: «Брюэрз», «Канзас-Сити»: «Ройалз»}
Прочь, Сихокс! Ты команда НФЛ.
Ключи словаря и индексы списка
Возможно, вы заметили, что интерпретатор вызывает такое же исключение, KeyError
, когда доступ к словарю осуществляется с помощью неопределенного ключа или числового индекса:
>>>
>>> MLB_team['Торонто'] Traceback (последний последний вызов): Файл "", строка 1, в MLB_team['Торонто'] KeyError: «Торонто» >>> MLB_команда[1] Traceback (последний последний вызов): Файл " ", строка 1, в MLB_команда[1] Ошибка ключа: 1
По сути, это та же ошибка. В последнем случае [1]
выглядит как числовой индекс, но это не так.
Позже в этом руководстве вы увидите, что объект любого неизменяемого типа может использоваться в качестве ключа словаря. Соответственно, нет никаких причин, по которым вы не можете использовать целые числа:
.>>>
>>> d = {0: 'a', 1: 'b', 2: 'c', 3: 'd'} >>> д {0: "а", 1: "б", 2: "в", 3: "г"} >>> д[0] а >>> д[2] 'с'
В выражениях MLB_team[1]
, d[0]
и d[2]
числа в квадратных скобках выглядят так, как будто они могут быть индексами. Но они не имеют ничего общего с порядком элементов в словаре. Python интерпретирует их как словарные ключи. Если вы определите этот же словарь в обратном порядке, вы все равно получите те же значения, используя те же ключи:
>>>
>>> d = {3: 'd', 2: 'c', 1: 'b', 0: 'a'} >>> д {3: "г", 2: "в", 1: "б", 0: "а"} >>> д[0] а >>> д[2] 'с'
Синтаксис может выглядеть похожим, но словарь нельзя рассматривать как список:
>>>
>>> тип(г) <класс 'дикт'> >>> д[-1] Traceback (последний последний вызов): Файл "", строка 1, в д[-1] Ключевая ошибка: -1 >>> д[0:2] Traceback (последний последний вызов): Файл " ", строка 1, в д[0:2] TypeError: unhashable type: 'slice' >>> d.append('e') Traceback (последний последний вызов): Файл " ", строка 1, в д. добавить ('е') AttributeError: объект 'dict' не имеет атрибута 'append'
Примечание: Хотя доступ к элементам в словаре не зависит от порядка, Python гарантирует сохранение порядка элементов в словаре. При отображении элементы будут отображаться в том порядке, в котором они были определены, и итерация по ключам также будет происходить в этом порядке. Элементы, добавленные в словарь, добавляются в конце. Если элементы удаляются, порядок оставшихся элементов сохраняется.
На такое сохранение порядка можно рассчитывать совсем недавно. Он был добавлен как часть спецификации языка Python в версии 3.7. Однако это было верно и для версии 3.6 — случайно в результате реализации, но не гарантируется спецификацией языка.
Удалить рекламу
Создание словаря постепенно
Определение словаря с помощью фигурных скобок и списка пар ключ-значение, как показано выше, вполне допустимо, если вы заранее знаете все ключи и значения. Но что, если вы хотите создать словарь на лету?
Вы можете начать с создания пустого словаря, который определяется пустыми фигурными скобками. Затем вы можете добавлять новые ключи и значения по одному:
>>>
>>> человек = {} >>> тип(человек) <класс 'дикт'> >>> person['fname'] = 'Джо' >>> person['lname'] = 'Fonebone' >>> человек['возраст'] = 51 >>> человек['супруга'] = 'Эдна' >>> человек['дети'] = ['Ральф', 'Бетти', 'Джоуи'] >>> person['pets'] = {'dog': 'Fido', 'cat': 'Sox'}
Когда словарь создан таким образом, доступ к его значениям осуществляется так же, как и к любому другому словарю:
>>>
>>> человек {'fname': 'Джо', 'lname': 'Fonebone', 'возраст': 51, 'супруга': 'Эдна', 'дети': ['Ральф', 'Бетти', 'Джоуи'], 'домашние животные': {'собака': 'Фидо', 'кошка': 'Сокс'}} >>> человек['fname'] 'Джо' >>> человек['возраст'] 51 >>> человек['дети'] ['Ральф', 'Бетти', 'Джоуи']
Для получения значений в подсписке или подсловаре требуется дополнительный индекс или ключ:
>>>
>>> человек['дети'][-1] 'Джоуи' >>> человек['домашние животные']['кошка'] «Сокс»
Этот пример демонстрирует еще одну особенность словарей: значения, содержащиеся в словаре, не обязательно должны быть одного типа. В person
некоторые значения являются строками, одно — целым числом, одно — списком, а третье — другим словарем.
Точно так же, как значения в словаре не обязательно должны быть одного типа, ключи не обязательно должны быть одного типа:
>>>
>>> foo = {42: 'aaa', 2.78: 'bbb', True: 'ccc'} >>> Фу {42: 'aaa', 2.78: 'bbb', True: 'ccc'} >>> фу[42] 'ааа' >>> фоо[2.78] 'ббб' >>> foo[Истина] 'ссс'
Здесь один из ключей — целое число, один — число с плавающей запятой и один — логическое значение. Не очевидно, как это будет полезно, но вы никогда не знаете.
Обратите внимание, насколько универсальны словари Python. В MLB_team
одна и та же информация (название бейсбольной команды) сохраняется для каждого из нескольких различных географических местоположений. person
, с другой стороны, хранит различные типы данных для одного человека.
Вы можете использовать словари для самых разных целей, потому что существует очень мало ограничений на разрешенные ключи и значения. Но есть некоторые. Читать дальше!
Ограничения на ключи словаря
Почти любой тип значения может использоваться в качестве ключа словаря в Python. Вы только что видели этот пример, где в качестве ключей используются целые, плавающие и логические объекты:
>>>
>>> foo = {42: 'aaa', 2.78: 'bbb', True: 'ccc'} >>> Фу {42: 'aaa', 2.78: 'bbb', True: 'ccc'}
Вы даже можете использовать встроенные объекты, такие как типы и функции:
>>>
>>> d = {int: 1, float: 2, bool: 3} >>> д {<класс 'int'>: 1, <класс 'float'>: 2, <класс 'bool'>: 3} >>> д[число] 2 >>> d = {бин: 1, шестнадцатеричный: 2, окт: 3} >>> д[октябрь] 3
Однако есть пара ограничений, которым должны соответствовать словарные ключи.
Во-первых, данный ключ может появиться в словаре только один раз. Дублирование ключей не допускается. Словарь сопоставляет каждому ключу соответствующее значение, поэтому нет смысла сопоставлять конкретный ключ более одного раза.
Вы видели выше, что когда вы присваиваете значение уже существующему ключу словаря, он не добавляет ключ во второй раз, а заменяет существующее значение:
>>>
>>> MLB_team = { ... «Колорадо»: «Скалистые горы», ... «Бостон»: «Ред Сокс», ... "Миннесота": "Близнецы", ... «Милуоки»: «Пивоварки», ... 'Сиэтл' : 'Моряки' ... } >>> MLB_team['Миннесота'] = 'Тимбервулвз' >>> MLB_команда {'Колорадо': 'Скалистые горы', 'Бостон': 'Ред Сокс', 'Миннесота': 'Тимбервулвз', «Милуоки»: «Брюэрз», «Сиэтл»: «Моряки»}
Аналогичным образом, если вы укажете ключ второй раз во время первоначального создания словаря, второе вхождение переопределит первое:
>>>
>>> MLB_team = { ... «Колорадо»: «Скалистые горы», ... «Бостон»: «Ред Сокс», ... "Миннесота": "Тимбервулвз", ... «Милуоки»: «Пивоварки», ... «Сиэтл»: «Моряки», ... 'Миннесота': 'Близнецы' ... } >>> MLB_команда {'Колорадо': 'Скалистые горы', 'Бостон': 'Ред Сокс', 'Миннесота': 'Близнецы', «Милуоки»: «Брюэрз», «Сиэтл»: «Моряки»}
Прочь, Тимбервулвз! Ты команда НБА. Вроде, как бы, что-то вроде.
Во-вторых, ключ словаря должен быть неизменяемого типа. Вы уже видели примеры, в которых несколько знакомых вам неизменяемых типов — целое число, число с плавающей запятой, строка и логическое значение — служили ключами словаря.
Кортеж также может быть ключом словаря, поскольку кортежи неизменяемы:
>>>
>>> d = {(1, 1): 'a', (1, 2): 'b', (2, 1): 'c', (2, 2): 'd '} >>> д[(1,1)] а >>> д[(2,1)] 'с'
(Вспомните из обсуждения кортежей, что одним из обоснований использования кортежа вместо списка является то, что существуют обстоятельства, когда требуется неизменяемый тип. Это один из них.)
Однако ни список, ни другой словарь не могут служить ключом словаря, поскольку списки и словари могут изменяться:
>>>
>>> d = {[1, 1]: 'a', [1, 2]: 'b', [2, 1]: 'c', [2, 2]: 'd '} Traceback (последний последний вызов): Файл "", строка 1, в d = {[1, 1]: 'а', [1, 2]: 'б', [2, 1]: 'с', [2, 2]: 'г'} TypeError: unhashable type: 'list'
Техническое примечание: Почему в сообщении об ошибке указано «unhashable»?
Технически не совсем правильно говорить, что объект должен быть неизменяемым, чтобы его можно было использовать в качестве ключа словаря. Точнее, объект должен быть хэшируемым, то есть его можно передать хэш-функции. Хэш-функция берет данные произвольного размера и сопоставляет их с относительно более простым значением фиксированного размера, называемым хеш-значением (или просто хеш), которое используется для поиска и сравнения в таблице.
Встроенная функция Python hash()
возвращает значение хеш-функции для объекта, который можно хешировать, и вызывает исключение для объекта, который не является хешируемым:
>>>
>>> hash('foo') 11132615637596761 >>> хэш([1, 2, 3]) Traceback (последний последний вызов): Файл "", строка 1, в TypeError: unhashable type: 'list'
Все встроенные неизменяемые типы, о которых вы уже узнали, являются хэшируемыми, а изменяемые контейнерные типы (списки и словари) — нет. Таким образом, для настоящих целей вы можете думать о хешируемом и неизменяемом как о более или менее синонимичных.
В будущих уроках вы столкнетесь с изменяемыми объектами, которые также можно хэшировать.
Удалить рекламу
Ограничения на словарные значения
Напротив, нет никаких ограничений на значения словаря. Буквально никакой. Значением словаря может быть любой тип объекта, который поддерживает Python, включая изменяемые типы, такие как списки и словари, а также определяемые пользователем объекты, о которых вы узнаете в следующих руководствах.
Также нет ограничений на многократное появление определенного значения в словаре:
>>>
>>> d = {0: 'а', 1: 'а', 2: 'а', 3: 'а'} >>> д {0: "а", 1: "а", 2: "а", 3: "а"} >>> д[0] == д[1] == д[2] Истинный
Операторы и встроенные функции
Вы уже познакомились со многими операторами и встроенными функциями, которые можно использовать со строками, списками и кортежами. Некоторые из них также работают со словарями.
Например, операторы в
и не в
возвращают True
или False
в зависимости от того, встречается ли указанный операнд как ключ в словаре:
>>>
>>> MLB_team = { ... «Колорадо»: «Скалистые горы», ... «Бостон»: «Ред Сокс», ... "Миннесота": "Близнецы", ... «Милуоки»: «Пивоварки», ... 'Сиэтл' : 'Моряки' ... } >>> "Милуоки" в MLB_team Истинный >>> «Торонто» в MLB_team ЛОЖЬ >>> "Торонто" не в MLB_team Истинный
Вы можете использовать в операторе
вместе с оценкой короткого замыкания, чтобы избежать возникновения ошибки при попытке доступа к ключу, которого нет в словаре:
>>>
>>> MLB_team['Торонто'] Traceback (последний последний вызов): Файл "", строка 1, в MLB_team['Торонто'] KeyError: «Торонто» >>> «Торонто» в MLB_team и MLB_team['Торонто'] ЛОЖЬ
Во втором случае из-за короткого замыкания выражение MLB_team['Toronto']
не оценивается, поэтому исключение KeyError
не возникает.
Функция len()
возвращает количество пар ключ-значение в словаре:
>>>
>>> MLB_team = { ... «Колорадо»: «Скалистые горы», ... «Бостон»: «Ред Сокс», ... "Миннесота": "Близнецы", ... «Милуоки»: «Пивоварки», ... 'Сиэтл' : 'Моряки' ... } >>> Лен(MLB_team) 5
Методы встроенного словаря
Как и в случае строк и списков, существует несколько встроенных методов, которые можно вызывать для словарей. Фактически, в некоторых случаях методы списка и словаря имеют одно и то же имя. (При обсуждении объектно-ориентированного программирования вы увидите, что для разных типов вполне допустимо иметь методы с одинаковыми именами.)
Ниже приводится обзор методов, применимых к словарям:
д.очистить()
Очищает словарь.
d.clear()
очищает словарь d
всех пар ключ-значение:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> д {'а': 10, 'б': 20, 'в': 30} >>> д. очистить() >>> д {}
Удалить рекламу
d.get([ ])
Возвращает значение ключа, если он существует в словаре.
Словарь Python .get()
обеспечивает удобный способ получения значения ключа из словаря без предварительной проверки существования ключа и без возникновения ошибки.
d.get(
ищет в словаре d
и возвращает соответствующее значение, если оно найдено. Если
не найден, возвращается None
:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> напечатать (d.get ('b')) 20 >>> печать (d.get ('z')) Никто
Если <ключ>
не найден и указан необязательный аргумент <по умолчанию>
, возвращается это значение вместо Нет
:
>>>
>>> print(d. get('z', -1)) -1
д.элементы()
Возвращает список пар ключ-значение в словаре.
d.items()
возвращает список кортежей, содержащих пары ключ-значение в d
. Первый элемент в каждом кортеже — это ключ, а второй элемент — значение ключа:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> д {'а': 10, 'б': 20, 'в': 30} >>> список(d.items()) [('а', 10), ('б', 20), ('в', 30)] >>> список(d.items())[1][0] 'б' >>> список(d.items())[1][1] 20
д.ключи()
Возвращает список ключей в словаре.
d.keys()
возвращает список всех ключей в d
:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> д {'а': 10, 'б': 20, 'в': 30} >>> список(d.keys()) ['а', 'б', 'в']
д.значения()
Возвращает список значений в словаре.
d.values()
возвращает список всех значений в d
:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> д {'а': 10, 'б': 20, 'в': 30} >>> список(d.values()) [10, 20, 30]
Любые повторяющиеся значения в d
будут возвращены столько раз, сколько они встречаются:
>>>
>>> d = {'a': 10, 'b': 10, 'c': 10} >>> д {'а': 10, 'б': 10, 'в': 10} >>> список(d.values()) [10, 10, 10]
Техническое примечание: Методы .items()
, .keys()
и .values()
на самом деле возвращают нечто, называемое объектом представления . Объект просмотра словаря более или менее похож на окно с ключами и значениями. Для практических целей вы можете думать об этих методах как о возвращаемых списках ключей и значений словаря.
Удалить рекламу
d. pop([ ])
Удаляет ключ из словаря, если он присутствует, и возвращает его значение.
Если
присутствует в d
, d.pop(
удаляет
и возвращает связанное с ним значение:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> д.поп('б') 20 >>> д {'а': 10, 'в': 30}
d.pop(
вызывает исключение KeyError
, если
не находится в d
:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> d.pop('z') Traceback (последний последний вызов): Файл "", строка 1, в д.поп('г') KeyError: 'з'
Если <ключ>
не находится в d
и указан необязательный аргумент <по умолчанию>
, то возвращается это значение, и исключение не возникает:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> d. pop('z', -1) -1 >>> д {'а': 10, 'б': 20, 'в': 30}
д.попитем()
Удаляет пару ключ-значение из словаря.
d.popitem()
удаляет последнюю добавленную пару ключ-значение из d
и возвращает ее как кортеж:
>>>
>>> d = {'a': 10, 'b': 20, 'c': 30} >>> д.попитем() ('с', 30) >>> д {'а': 10, 'б': 20} >>> д.попитем() ('б', 20) >>> д {'а': 10}
Если d
пусто, d.popitem()
вызывает исключение KeyError
:
>>>
>>> д = {} >>> д.попитем() Traceback (последний последний вызов): Файл "", строка 1, в д.попитем() KeyError: 'popitem(): словарь пуст'
Примечание: В версиях Python ниже 3.6 popitem()
вернет произвольную (случайную) пару ключ-значение, поскольку до версии 3.6 словари Python были неупорядочены.
д.обновление(<объект>)
Объединяет словарь с другим словарем или с итерацией пар ключ-значение.
Если
является словарем, d.update(
объединяет записи из
в d
. Для каждого ключа в
:
- Если ключ отсутствует в
d
, пара ключ-значение изд
. - Если ключ уже присутствует в
d
, соответствующее значение вd
для этого ключа обновляется до значения из
Вот пример, показывающий объединение двух словарей:
>>>
>>> d1 = {'a': 10, 'b': 20, 'c': 30} >>> d2 = {'b': 200, 'd': 400} >>> d1.update(d2) >>> д1 {'a': 10, 'b': 200, 'c': 30, 'd': 400}
В этом примере клавиша 'b'
уже существует в d1
, поэтому его значение обновляется до 200
, значение для этого ключа из d2
. Однако в d1
нет ключа 'd'
, поэтому пара ключ-значение добавляется из d2
.
также может быть последовательностью пар ключ-значение, подобно тому, как функция dict()
используется для определения словаря. Например,
можно указать как список кортежей:
>>>
>>> d1 = {'a': 10, 'b': 20, 'c': 30} >>> d1.update([('b', 200), ('d', 400)]) >>> д1 {'a': 10, 'b': 200, 'c': 30, 'd': 400}
Или значения для объединения можно указать в виде списка аргументов ключевого слова:
>>>
>>> d1 = {'a': 10, 'b': 20, 'c': 30} >>> d1.update(b=200, d=400) >>> д1 {'a': 10, 'b': 200, 'c': 30, 'd': 400}
Удалить рекламу
Вывод
В этом руководстве вы рассмотрели основные свойства словаря Python и узнали, как получить доступ к данным словаря и управлять ими.
Списки и словари — два наиболее часто используемых типа Python. Как вы видели, они имеют много общего, но различаются тем, как осуществляется доступ к их элементам. Доступ к элементам списков осуществляется по числовому индексу в зависимости от порядка, а доступ к элементам словаря осуществляется по ключу
.Из-за этой разницы списки и словари, как правило, подходят для разных обстоятельств. Теперь у вас должно быть хорошее представление о том, что лучше всего подходит для данной ситуации.
Далее вы узнаете о наборах Python . Набор — еще один составной тип данных, но он сильно отличается ни от списка, ни от словаря.
Примите участие в викторине: Проверьте свои знания с помощью нашей интерактивной викторины «Словари Python». По завершении вы получите балл, чтобы вы могли отслеживать свой прогресс в обучении с течением времени:
Пройдите тест »
Смотреть сейчас Это руководство содержит связанный с ним видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Словари в Python
Работа со словарями Python: шпаргалка | by Mahbubul Alam
Photo by Eddy Klaus on UnsplashДоступ, редактирование и просмотр элементов словаря
Некоторые основы
Словари в Python представляют собой набор пар ключ-значение, то есть каждый элемент в словаре имеет ключ и ассоциированное значение.
Если мы хотим записать цены на некоторые товары в продуктовом магазине, обычно мы записываем их на листе бумаги следующим образом:
яйца — 4,99
банан — 1,49
сыр — 4,5
баклажаны — 2,5
хлеб — 3,99
. Мы можем представить то же самое в структуре данных словаря Python следующим образом:
{"яйца": 4,99,
"банан": 1,49,
"сыр": 4,5,
"баклажан": 2,5,
"хлеб": 3,99 }
Обратите внимание на различия. В словаре
- каждый ключ заключен в кавычки, потому что это строки
- связанные значения не заключены в кавычки, потому что они числовые
- ключи и значения разделены двоеточием (:)
- элементы разделены запятыми
Теперь в первых элементах у нас есть {"яйца": 4. 99}
, но на самом деле яйца могут иметь несколько значений — одно для коричневых яиц, одно для белых яиц и одно для органических яиц — и словари python позволяют добавлять в словарь более одного значения, например, {«яйца»: [ 3,99, 4,99, 5,50]}
.
Давайте дадим этому словарю имя и поиграем с ним:
product_items = {"eggs": [3.99, 4.99, 5.50],
"banana": 1.49,
"cheese": 4.5,
"баклажан": 2.5 ,
"bread": 3.99}
Вы можете открыть свой IDE/текстовый редактор и следовать приведенным ниже кодам для работы с только что созданным словарем.
Добавление и удаление элементов
Мы создали наш первоначальный словарь из 5 элементов, но мы можем расширить его, добавив больше элементов:
product_items["onion"] = 3,50
Вышло: {"яйца": [3,99, 4,99, 5,50], "банан": 1,49, "сыр": 4,5, "баклажан": 2,5, "хлеб": 3,99, "лук": 3,50}
Можно добавить несколько элементов аналогичным образом.
Можно и наоборот — удалить один или несколько пунктов из этого списка. Есть несколько способов сделать это:
Удалить последний элемент с помощью метода popitem()
:
product_items.popitem()Out: {"яйца": [3.99, 4.99, 5.50], "банан": 1,49, "сыр": 4,5, "баклажан": 2,5, "хлеб": 3,99}
Или удалить элемент по его ключевому имени, используя только метод pop()
:
product_items.pop("банан")Out: {"яйца": [3.99, 4.99, 5.50], "сыр": 4.5, "баклажан": 2.5, "хлеб": 3.99}
И, наконец, вы можете очистить весь словарь (то есть сделать его пустым) с помощью метода clear()
и удалить весь словарь с помощью ключевого слова del
(просто будьте осторожны, если вам когда-нибудь придется его использовать).
Вам может быть интересно, где можно найти все эти методы? Просто нажмите клавишу «Tab» на клавиатуре, и все методы появятся.
Доступ к методам словаря в PythonДоступ к элементам
Часто бывает необходимо получить список ключей или значений в словаре для дальнейшего анализа (позже мы увидим, почему).
Для доступа ко всем ключам:
product_items.keys()Out: dict_keys(['eggs', 'banana', 'cheese', 'баклажан', 'bread'])
Вместо этого для доступа ко всем значениям:
product_items.values()Out: dict_values([[3.99, 4.99, 5.5], 1.49, 4.5, 2.5, 3.99])
Мы также можем запросить словарь для доступа к значению определенного ключа (например, цена бананов ). Есть несколько способов сделать это:
# доступ к значениям по ключу
product_items["banana"]# или
product_items.get("banana")Out: 1.49
А как же яйца? У нас есть три разные цены на яйца. Мы можем выбрать доступ ко всем ценам:
food_items.get("eggs")Out: [3.99, 4.99, 5.5]
Мы также можем выбрать доступ только к первой из списка по позиции индекса:
food_items. get("eggs")[0]Out: 3.99
На самом деле мы можем получить доступ к более сложным вложенным элементам/ключам/значениям словаря аналогичным образом.
Еще несколько методов и функций
Помимо перечисленных выше методов, которые чаще всего используются со словарем, есть несколько методов и функций, которые могут пригодиться при анализе данных:
Чтобы получить количество элементов в словарь:
len(grocery_items)Out: 5
Чтобы изменить значение ключа:
product_items. update({"banana": 0.85})
Чтобы преобразовать ключи в список:
list(grocery_items )Out: ['яйца', 'банан', 'сыр', 'баклажан', 'хлеб']
Если словарь действительно большой, мы можем проверить, существует ли ключ:
"potato" в product_itemsOut: False
И, наконец, для возврата строкового представления словаря:
str(grocery_items)Out: "{ 'яблоко': 2,5, 'апельсин': 4,99, 'банан': 0,59}"
Перебор словаря
Часто бывает необходимо изменить элементы словаря или извлечь определенные значения или ключи на основе определенных условий. Поскольку словари являются повторяемыми объектами, 9Для таких операций часто используются циклы 0045 for . Вот несколько примеров:
Простой цикл для вывода всех ключей:
for i in food_items:
print(i)Out:
яйца
банан
сыр
баклажан
хлеб
Или цикл for
для условной фильтрации ключей словаря:
for i in product_items. keys():
if i.startswith("e"):
print(i)Out:
яйца
баклажаны
Словарные понимания
Подобно спискам, Python также поддерживает словари для выполнения различных операций. Циклы для
, которые мы создали выше, также могут быть выражены в синтаксисе понимания словаря.
Например, чтобы распечатать значения словаря:
[x вместо x в product_items.values()]Out:
[[3.99, 4.99, 5.5], 1.49, 4.5, 2.5, 3.99]
Сводка
Подводя итог, мы рассмотрели в этой статье:
- Словари Python — это итерируемые объекты с парами ключ-значение
- словарей можно редактировать для добавления, удаления и обновления значений
- элементов словаря можно получить доступ с помощью таких методов, как
.keys()
,.values()
и.items()
- словари являются итерируемыми объектами , поэтому Python допускает
вместо
циклов или понятий словаря.
Я упустил многие другие методы и функциональные возможности, но я надеюсь, что это даст преимущество для создания шпаргалки для работы с объектами словаря Python.
Если у вас есть комментарии, не стесняйтесь записывать их ниже или связаться со мной через Medium, Twitter или LinkedIn.
Подробное руководство (с 52 примерами кода)
1 апреля 2022 г.
Что такое словарь в Python?
Словарь Python — это структура данных, которая позволяет нам легко писать очень эффективный код. Во многих других языках эта структура данных называется хеш-таблицей , потому что ее ключи можно хэшировать. Чуть позже мы поймем, что это значит.
Словарь Python представляет собой набор из пар ключ:значение
. Вы можете думать о них как о словах и их значении в обычном словаре. Говорят, что значения сопоставлены с ключами. Например, в физическом словаре определение наука, которая ищет шаблоны в сложных данных с использованием компьютерных методов , сопоставляется с ключом наука о данных .
В этом руководстве по Python вы узнаете, как создать словарь Python, как использовать его методы и понимание словаря , а также что лучше: словарь или список. Чтобы получить максимальную отдачу от этого руководства, вы уже должны быть знакомы со списками Python, циклами for, условными операторами и чтением наборов данных с помощью метода reader()
. Если нет, вы можете узнать больше на Dataquest.
Для чего используются словари Python?
СловариPython позволяют нам связать значение с уникальным ключом , а затем с быстро получить доступ к этому значению . Их рекомендуется использовать всякий раз, когда мы хотим найти (искать) определенный объект Python. Мы также можем использовать списки для этой области, но они намного медленнее, чем словари.
Эта скорость обусловлена тем, что ключи словаря хэшируются . Каждый неизменяемый объект в Python является хэшируемым, поэтому мы можем передать его функции hash()
, которая вернет хеш-значение этого объекта. Затем эти значения используются для поиска значения, связанного с его уникальным ключом. См. пример использования функция hash()
ниже:
печать(хэш("b"))
2132352943288137677
Строка b
имеет хеш-значение 2132352943288137677
. В вашем случае это значение может быть другим.
Как создать словарь?
Но давайте остановимся на теории и перейдем непосредственно к созданию словаря. У нас есть два основных метода определения словаря: с помощью фигурных скобок {}
или с помощью метода dict()
. Мы создадим два пустых словаря:
# Создать словарь словарь = {} # Метод фигурных скобок other_dictionary = dict() # Метод Dict # Являются ли приведенные выше словари эквивалентными? печать (тип (словарь)) печать (тип (другой_словарь)) печать (словарь == другой_словарь)
Правда
Мы видим, что оба словаря имеют одинаковый тип данных и эквивалентны. Теперь давайте заполним словарь ключами и значениями. Мы можем сделать это, используя квадратные скобки, например, Dictionary[key] = value
. Затем мы можем получить доступ к значению, используя обозначение скобок с ключом, который мы хотим получить в скобках: словарь[ключ]
.
# Заполнить словарь словарь["ключ1"] = "значение1" # Ключ доступа1 печать (словарь ["key1"])
значение1
Возвращается значение key1
. Мы также можем создать предварительно заполненный словарь, используя приведенный ниже синтаксис:
# Создать словарь с предустановленными ключами/значениями словарь = {"ключ1": "значение1"} # Ключ доступа1 печать (словарь ["key1"])
значение1
В конечном счете, другой метод использует dict()
, в котором мы предоставляем ключи и значения в виде списка аргументов ключевого слова или в виде списка кортежей:
# Список аргументов ключевого слова словарь = dict(key1="value1", key2="value2") # Показать словарь печать (словарь)
{'ключ1': 'значение1', 'ключ2': 'значение2'}
# Список кортежей словарь = dict([("ключ1", "значение1"), ("ключ2", "значение2")]) # Показать словарь печать (словарь)
{'ключ1': 'значение1', 'ключ2': 'значение2'}
Мы использовали строковый тип данных для ключа и значения, но какие другие допустимые типы данных? В словарях Python ключи должны быть хэшируемыми объектами (даже если это технически не корректно, мы также можем сказать, что объекты должны быть неизменяемыми ). Таким образом, изменяемые типы данных, такие как списки, не допускаются. Давайте попробуем hash()
различных типов данных и посмотрим, что получится:
# Хеширование различных типов данных print(хэш(1)) # Целое число print(хэш(1.2)) # Число с плавающей запятой print(hash("dataquest")) # Строка print(hash((1, 2))) # Кортеж печать (хэш ([1, 2, 3]))
1 461168601842738689 -3975257749889514375 -3550055125485641917 -------------------------------------------------- ------------------------- TypeError Traceback (последний последний вызов) ~\AppData\Local\Temp/ipykernel_10024/758405818.py в 4 print(hash("dataquest")) # Строка 5 print(hash((1, 2))) # Кортеж ----> 6 print(хэш([1, 2, 3])) TypeError: нехэшируемый тип: «список»
Целые числа, числа с плавающей запятой, строки и кортежи являются типами данных, допускающими хеширование (и они также неизменяемые ), в то время как списки являются нехешируемым типом данных (и они изменяемые ). Python использует 90 138 хэш-значений 90 139 для быстрого доступа к значениям словаря.
С другой стороны, значения могут быть любого типа. Давайте добавим в словарь больше элементов, используя разные типы данных:
# Добавить больше элементов в словарь словарь[42] = «ответ на главный вопрос жизни, вселенной и всего остального». словарь [1.2] = ["одна точка два"] словарь["список"] = ["просто", "а", "список", "с", "ан", "целое число", 3] # Показать словарь печать(словарь)
{'ключ1': 'значение1', 'ключ2': 'значение2', 42: 'ответ на главный вопрос жизни, вселенной и всего остального.', 1.2: ['один целых два'], 'список ': ['просто', 'а', 'список', 'с', 'ан', 'целое число', 3]}
Кроме того, мы можем изменить значение ключа с нотацией скобок , которую мы использовали для заполнения словаря:
# Изменить значение словарь["список"] = ["это другое", "список"] # Показать словарь распечатать (словарь) Распечатать() # Доступ к значению "список" печать (словарь ["список"])
{'ключ1': 'значение1', 'ключ2': 'значение2', 42: 'ответ на главный вопрос жизни, вселенной и всего остального. ', 1.2: ['один целых два'], 'список ': ["это другое", "список"]} ["это другое", "список"]
Наконец, ключа словаря должны быть уникальными . Попробуем создать словарь с повторяющимися ключами:
# Словарь с повторяющимися ключами дублированные_ключи = {"ключ1": "значение1", "ключ1": "значение2", "ключ1": "значение3"} # Ключ доступа1 print(duplicated_keys["key1"])
значение3
Возвращается только значение последнего ключа, поэтому технически мы можем использовать повторяющиеся ключи, но это не рекомендуется, поскольку одной из сильных сторон словарей является быстрое получение значения, связанного с некоторым ключом. Если есть дубликаты, мы можем вернуть значение, которое нам не нужно. Представьте, что мы ищем значение слова «данные» и находим в словаре 10 разных статей для этого слова; это может сбивать с толку.
Словарные методы Python
Теперь давайте посмотрим, какие методы мы можем использовать для работы со словарями.
обновление()
Метод update()
полезен всякий раз, когда мы хотим объединить словари или добавить новые пары ключ:значение с помощью итерации (итерации — это, например, списки или кортежи). Давайте сделаем пример, используя персонажей из вселенной Гарри Поттера и домов, которым они принадлежат ( спойлер : мы будем использовать наборы данных Гарри Поттера позже!):
# Создать словарь Гарри Поттера harry_potter_dict = { «Гарри Поттер»: «Гриффиндор», «Рон Уизли»: «Гриффиндор», «Гермиона Грейнджер»: «Гриффиндор» } # Показать словарь печать (harry_potter_dict)
{'Гарри Поттер': 'Гриффиндор', 'Рон Уизли': 'Гриффиндор', 'Гермиона Грейнджер': 'Гриффиндор'}
Давайте теперь добавим других персонажей и их дома, используя различные опции, доступные для метода update()
:
# Символы для добавления в словарь Гарри Поттера add_characters_1 = { «Альбус Дамблдор»: «Гриффиндор», «Луна Лавгуд»: «Равенкло» } # Объединение словарей harry_potter_dict. update(add_characters_1) # Показать словарь печать (harry_potter_dict)
{'Гарри Поттер': 'Гриффиндор', 'Рон Уизли': 'Гриффиндор', 'Гермиона Грейнджер': 'Гриффиндор', 'Альбус Дамблдор': 'Гриффиндор', 'Луна Лавгуд': 'Равенкло'}
Мы видим, что словарь теперь содержит Альбуса Дамблдора и Луну Лавгуд. Мы также можем использовать итерацию для добавления новых элементов в словарь:
# Используйте итерации для обновления словаря add_characters_2 = [ ["Драко Малфой", "Слизерин"], ["Седрик Диггори", "Хаффлпафф"] ] harry_potter_dict.update(add_characters_2) печать (harry_potter_dict)
{'Гарри Поттер': 'Гриффиндор', 'Рон Уизли': 'Гриффиндор', 'Гермиона Грейнджер': 'Гриффиндор', 'Альбус Дамблдор': 'Гриффиндор', 'Луна Лавгуд': 'Равенкло', 'Драко Малфой ': 'Слизерин', 'Седрик Диггори': 'Хаффлпафф'}
Мы использовали список списков, где первый элемент каждого списка — это имя персонажа, а второй элемент — его дом. Затем метод update()
автоматически свяжет первый элемент (ключ) со вторым элементом (значением). Ради эксперимента попробуйте обновить словарь списком списков, но с тремя элементами в каждом вложенном списке.
Мы также можем использовать список кортежей:
# Используйте итерации для обновления словаря add_characters_3 = [ («Рубеус Хагрид», «Гриффиндор»), («Минерва МакГонагалл», «Гриффиндор») ] harry_potter_dict.update(add_characters_3) печать (harry_potter_dict)
{'Гарри Поттер': 'Гриффиндор', 'Рон Уизли': 'Гриффиндор', 'Гермиона Грейнджер': 'Гриффиндор', 'Альбус Дамблдор': 'Гриффиндор', 'Луна Лавгуд': 'Равенкло', 'Драко Малфой ': 'Слизерин', 'Седрик Диггори': 'Хаффлпафф', 'Рубеус Хагрид': 'Гриффиндор', 'Минерва МакГонагалл': 'Гриффиндор'}
дел
Что делать, если мы хотим удалить пару ключ:значение
из словаря? Мы можем использовать оператор del
. Важно отметить, что del
— это не эксклюзивный метод словаря, а скорее ключевое слово Python, которое мы можем использовать в различных ситуациях для удаления любого объекта Python (например, переменной, функции, класса, элемента списка и т. д.).
# Удалить пару ключ:значение del harry_potter_dict["Минерва МакГонагалл"] печать (harry_potter_dict)
{'Гарри Поттер': 'Гриффиндор', 'Рон Уизли': 'Гриффиндор', 'Гермиона Грейнджер': 'Гриффиндор', 'Альбус Дамблдор': 'Гриффиндор', 'Луна Лавгуд': 'Равенкло', 'Драко Малфой ': 'Слизерин', 'Седрик Диггори': 'Хаффлпафф', 'Рубеус Хагрид': 'Гриффиндор'}
Если мы попытаемся удалить пару, которой нет в словаре, мы получим KeyError
:
# Удалить пару ключ:значение, которой нет в словаре дель harry_potter_dict["Волдеморт"]
-------------------------------------------------- -------------------------- KeyError Traceback (последний последний вызов) ~\AppData\Local\Temp/ipykernel_10024/3860415884.py в 1 # Удалить пару ключ:значение, которой нет в словаре ----> 2 del harry_potter_dict["Волдеморт"] KeyError: «Волдеморт»
popitem()
и pop()
Иногда нам нужно удалить последний элемент, который был вставлен в словарь. 9Метод 0045 popitem() — это путь! Обратите внимание, что до Python 3.7 , этот метод удаляет случайный элемент из словаря:
# Вставить Волдеморта harry_potter_dict["Волдеморт"] = "Слизерин" print("Словарь с Волдемортом:") печать (harry_potter_dict) Распечатать() # Удалить последний вставленный элемент (Волдеморт) harry_potter_dict.popitem() print("Словарь после извлечения последнего вставленного элемента (Волдеморт):") печать (harry_potter_dict)
Словарь с Волдемортом: {'Гарри Поттер': 'Гриффиндор', 'Рон Уизли': 'Гриффиндор', 'Гермиона Грейнджер': 'Гриффиндор', 'Альбус Дамблдор': 'Гриффиндор', 'Луна Лавгуд': 'Равенкло', 'Драко Малфой' : 'Слизерин', 'Седрик Диггори': 'Хаффлпафф', 'Рубеус Хагрид': 'Гриффиндор', 'Волдеморт': 'Слизерин'} Словарь после извлечения последнего вставленного элемента (Волдеморт): {'Гарри Поттер': 'Гриффиндор', 'Рон Уизли': 'Гриффиндор', 'Гермиона Грейнджер': 'Гриффиндор', 'Альбус Дамблдор': 'Гриффиндор', 'Луна Лавгуд': 'Равенкло', 'Драко Малфой' : 'Слизерин', 'Седрик Диггори': 'Хаффлпафф', 'Рубеус Хагрид': 'Гриффиндор'}
Мы также можем удалить определенную пару ключ:значение
и вернуть значение с помощью метода pop()
:
# Вставить Волдеморта harry_potter_dict["Волдеморт"] = "Слизерин" print("Словарь с Волдемортом:") печать (harry_potter_dict) Распечатать() # Удалить последний вставленный элемент (Волдеморт) print("Убрать Волдеморта и вернуть его дом:") печать (harry_potter_dict. pop («Волдеморт»)) Распечатать() print("Словарь после извлечения последнего вставленного элемента (Волдеморт):") печать (harry_potter_dict)
Словарь с Волдемортом: {'Гарри Поттер': 'Гриффиндор', 'Рон Уизли': 'Гриффиндор', 'Гермиона Грейнджер': 'Гриффиндор', 'Альбус Дамблдор': 'Гриффиндор', 'Луна Лавгуд': 'Равенкло', 'Драко Малфой' : 'Слизерин', 'Седрик Диггори': 'Хаффлпафф', 'Рубеус Хагрид': 'Гриффиндор', 'Волдеморт': 'Слизерин'} Убрать Волдеморта и вернуть его дом: Слизерин Словарь после извлечения последнего вставленного элемента (Волдеморт): {'Гарри Поттер': 'Гриффиндор', 'Рон Уизли': 'Гриффиндор', 'Гермиона Грейнджер': 'Гриффиндор', 'Альбус Дамблдор': 'Гриффиндор', 'Луна Лавгуд': 'Равенкло', 'Драко Малфой' : 'Слизерин', 'Седрик Диггори': 'Хаффлпафф', 'Рубеус Хагрид': 'Гриффиндор'}
получить()
Если мы попытаемся получить доступ к значению ключа, которого нет в словаре, Python вернет KeyError
. Чтобы обойти эту проблему, мы можем использовать метод get()
, который вернет значение, если его ключ есть в словаре, или вернет некоторое значение по умолчанию, которое мы установили:
# Вернуть существующее значение print(harry_potter_dict. get("Гарри Поттер", "Ключ не найден")) # Возвращаем значение по умолчанию, если ключ в словаре не найден print(harry_potter_dict.get("Волдеморт", "Ключ не найден")) # Попытаться получить значение несуществующего ключа, не получая print(harry_potter_dict["Волдеморт"])
Гриффиндор Ключ не найден -------------------------------------------------- ------------------------- KeyError Traceback (последний последний вызов) ~\AppData\Local\Temp/ipykernel_10024/3808675782.py в 6 7 # Попытаться получить значение несуществующего ключа без get ----> 8 print(harry_potter_dict["Волдеморт"]) KeyError: «Волдеморт»
setdefault()
Метод setdefault()
часто путают с методом .0045 метод get() . Они выполняют более или менее одну и ту же задачу. Действительно, если мы подозреваем, что в словаре есть несуществующий ключ, мы можем использовать этот метод для возврата значения по умолчанию. Однако, в отличие от get()
, этот метод вставляет значение этого ключа по умолчанию в словарь:
print("Словарь без Волдеморта") печать (harry_potter_dict) Распечатать() print("Вернуть значение Волдеморта по умолчанию. ") print(harry_potter_dict.setdefault("Волдеморт", "Слизерин")) Распечатать() print("Волдеморт теперь в словаре!") печать (harry_potter_dict)
Словарь без Волдеморта. {'Гарри Поттер': 'Гриффиндор', 'Рон Уизли': 'Гриффиндор', 'Гермиона Грейнджер': 'Гриффиндор', 'Альбус Дамблдор': 'Гриффиндор', 'Луна Лавгуд': 'Равенкло', 'Драко Малфой' : 'Слизерин', 'Седрик Диггори': 'Хаффлпафф', 'Рубеус Хагрид': 'Гриффиндор'} Вернуть значение Волдеморта по умолчанию. Слизерин Волдеморт теперь в словаре! {'Гарри Поттер': 'Гриффиндор', 'Рон Уизли': 'Гриффиндор', 'Гермиона Грейнджер': 'Гриффиндор', 'Альбус Дамблдор': 'Гриффиндор', 'Луна Лавгуд': 'Равенкло', 'Драко Малфой' : 'Слизерин', 'Седрик Диггори': 'Хаффлпафф', 'Рубеус Хагрид': 'Гриффиндор', 'Волдеморт': 'Слизерин'}
элементы()
, ключи()
и значения()
Что, если мы хотим вернуть все пар ключ:значение
? Или только ключи? Что насчет ценностей?
Ответом на первый вопрос является метод items()
. При использовании со словарем он вернет объект dict_items
, который по существу представляет собой список кортежей, каждый из которых содержит ключ и значение. Этот метод может быть полезен, когда мы перебираем словарь, как мы увидим позже.
печать (harry_potter_dict.items())
dict_items([('Гарри Поттер', 'Гриффиндор'), ('Рон Уизли', 'Гриффиндор'), ('Гермиона Грейнджер', 'Гриффиндор'), ('Альбус Дамблдор', 'Гриффиндор'), (' Луна Лавгуд», «Равенкло»), («Драко Малфой», «Слизерин»), («Седрик Диггори», «Хаффлпафф»), («Рубеус Хагрид», «Гриффиндор»), («Волдеморт», «Слизерин») )])
Если мы хотим получить только ключи, мы должны использовать метод keys()
. Он вернет объект dict_keys
:
печать (harry_potter_dict.keys())
dict_keys(['Гарри Поттер', 'Рон Уизли', 'Гермиона Грейнджер', 'Альбус Дамблдор', 'Луна Лавгуд', 'Драко Малфой', 'Седрик Диггори', 'Рубеус Хагрид', 'Волдеморт'])
Наконец, у нас есть метод values()
, который будет возвращать значения в виде объекта dict_values
:
печать (harry_potter_dict. values ())
dict_values(['Гриффиндор', 'Гриффиндор', 'Гриффиндор', 'Гриффиндор', 'Равенкло', 'Слизерин', 'Хаффлпафф', 'Гриффиндор', 'Слизерин'])
Когда я могу использовать все эти методы?
После этого обзора вы можете почувствовать себя ошеломленным количеством информации. Также непросто определить, когда следует использовать методы словаря Python. Не беспокойтесь — это абсолютно нормально. Вы не должны пытаться запомнить каждый метод и варианты его использования. Если перед вами стоит реальная проблема (проекты, управляемые Dataquest, могут быть хорошим началом) и вам нужно использовать словари, просто вернитесь к этому руководству по Python и посмотрите, сможете ли вы решить свои проблемы с помощью одного из этих методов. . Только так вы сможете получить ценный опыт и стать намного быстрее в использовании словарных методов в своих будущих проектах!
Перебор словаря
Поскольку мы можем перебирать списки, мы также можем перебирать словари. Они содержат два разных типа элементов, ключи и значения, поэтому мы можем одновременно перебирать оба типа элементов или только один из них.
Прежде всего, мы будем использовать метод items()
, который выдает как ключи, так и значения:
для ключа, значение в harry_potter_dict.items(): печать ((ключ, значение))
(«Гарри Поттер», «Гриффиндор») («Рон Уизли», «Гриффиндор») («Гермиона Грейнджер», «Гриффиндор») («Альбус Дамблдор», «Гриффиндор») («Луна Лавгуд», «Рэйвенкло») («Драко Малфой», «Слизерин») («Седрик Диггори», «Хаффлпафф») («Рубеус Хагрид», «Гриффиндор») («Волдеморт», «Слизерин»)
# Альтернативно для key_value в harry_potter_dict.items(): печать (ключ_значение)
(«Гарри Поттер», «Гриффиндор») («Рон Уизли», «Гриффиндор») («Гермиона Грейнджер», «Гриффиндор») («Альбус Дамблдор», «Гриффиндор») («Луна Лавгуд», «Рэйвенкло») («Драко Малфой», «Слизерин») («Седрик Диггори», «Хаффлпафф») («Рубеус Хагрид», «Гриффиндор») («Волдеморт», «Слизерин»)
для ключа, значение в harry_potter_dict. items(): print(f"Текущий ключ {key} и его значение {value}.")
Текущий ключ — Гарри Поттер, а его значение — Гриффиндор. Текущий ключ — Рон Уизли, а его значение — Гриффиндор. Текущий ключ — Гермиона Грейнджер, а его значение — Гриффиндор. Текущий ключ — Альбус Дамблдор, а его значение — Гриффиндор. Текущий ключ — Луна Лавгуд, а его значение — Рейвенкло. Текущий ключ — Драко Малфой, а его значение — Слизерин. Текущий ключ — Седрик Диггори, а его значение — Хаффлпафф. Текущий ключ — Рубеус Хагрид, а его значение — Гриффиндор. Текущий ключ — Волдеморт, а его значение — Слизерин.
Мы видим, что этот метод позволяет нам получить доступ как к ключам, так и к значениям. Что, если нас интересуют только ключи? Или только в ценностях?
# Цикл только по клавишам для ключа в harry_potter_dict.keys(): печать(ключ)
Гарри Поттер Рон Уизли Гермиона Грейнджер Альбус Дамблдор Луна Лавгуд Драко Малфой Седрик Диггори Рубеус Хагрид Волдеморт
# Цикл только по значениям для значения в harry_potter_dict. values(): печать (значение)
Гриффиндор Гриффиндор Гриффиндор Гриффиндор Равенкло Слизерин Хаффлпафф Гриффиндор Слизерин
Давайте попрактикуемся, а также изучим немного более продвинутый метод. Иногда нам нужно вычислить частоту каждого значения в словаре. Мы можем использовать метод Counter()
из коллекций
, который является отличным модулем Python с множеством полезных контейнеров, которые упрощают нашу жизнь кодирования.
из коллекции Счетчик импорта # Частота значений счетчик = счетчик (harry_potter_dict.values ()) печать(счетчик)
Counter({'Гриффиндор': 5, 'Слизерин': 2, 'Равенкло': 1, 'Хаффлпафф': 1})
Возвращаемый объект Счетчик
на самом деле очень похож на словарь. Мы можем использовать на нем методы keys()
, values()
и items()
!
# Элементы счетчика для k, v в counter.items(): печать ((к, v))
(«Гриффиндор», 5) («Равенкло», 1) («Слизерин», 2) ("Хаффлпафф", 1)
# Ключи счетчика для k в counter. keys(): печать(к)
Гриффиндор Равенкло Слизерин Хаффлпафф
# Значения счетчика для f в counter.values(): печать (е)
5 1 2 1
Таблицы частот
Словари Python очень удобны, когда нам нужно создать так называемые частотные таблицы . Проще говоря, ключи — это объекты, для которых мы хотим посчитать частоту, а значения — частоты. В качестве примера мы будем использовать набор данных фильмов о Гарри Поттере от Kaggle (набор данных Character.csv
). Допустим, мы хотим подсчитать частоту каждого дома, присутствующего в наборе данных. Для этого нам сначала нужно создать пустой словарь, который будет содержать таблицу частот. Затем мы должны пройтись по списку домов, и если ключ для дома уже присутствует в таблице частот, мы прибавляем 1 к его значению. В противном случае мы создаем ключ для текущего дома и сопоставляем его со значением 1 (это один , потому что с этим элементом мы сталкиваемся впервые). Мы также должны учитывать недостающие данные в нашем наборе данных.
из считывателя импорта csv # Открыть и прочитать набор данных open_file_char = open("Characters.csv", encoding="utf-8-sig") read_file_char = читатель (opened_file_char) hp_characters = список (read_file_char) # Инициализировать пустой словарь, который будет содержать таблицу частот дома = {} # Создаем частотную таблицу для символа в hp_characters[1:]: # Обратите внимание, что мы не должны включать заголовок в цикл; поэтому начинаем с индекса 1 дом = персонаж[4] если дом в домах: дома[дом] += 1 Элиф Хаус == "": Продолжать еще: дома[дом] = 1 печать(дома)
{'Гриффиндор': 31, 'Слизерин': 20, 'Равенкло': 12, 'Хаффлпафф': 8, 'Академия магии Шармбатона': 2, 'Институт Дурмстранг': 2}
Большинство персонажей из набора данных из Гриффиндора. Для практики попробуйте создать частотные таблицы других столбцов.
Вложенные словари
Подобно спискам, имеется также вложенных словаря . Другими словами, словарь может содержать другой словарь! Давайте воспользуемся набором данных Movies.csv
из того же набора наборов данных о Гарри Поттере. Может случиться так, что в вашей карьере вы работаете с несколькими наборами данных одновременно. Один из способов организовать их — использовать словари:
open_file_movies = открыть ("Movies.csv", encoding="utf-8-sig") read_file_movies = читатель (opened_file_movies) фильмы = список (read_file_movies) # ключ символов содержит набор данных персонажей Гарри Поттера Ключ #movies содержит набор данных фильмов hp_datasets = dict (персонажи = hp_characters, фильмы = фильмы)
Теперь мы можем легко получить доступ к каждому набору данных или определенной записи. Чтобы проиллюстрировать это, давайте получим доступ к столбцам набора данных символов
:
# Столбцы набора данных символов печать (hp_datasets ["символы"] [0])
['Идентификатор персонажа', 'Имя персонажа', 'Вид', 'Пол', 'Дом', 'Патронус', 'Жезл (дерево)', 'Жезл (ядро)']
Мы также можем получить доступ к столбцам обоих наборов данных с помощью цикла for:
# Столбцы обоих наборов данных для v в hp_datasets. values(): печать (v [0])
['Идентификатор персонажа', 'Имя персонажа', 'Вид', 'Пол', 'Дом', 'Патронус', 'Жезл (дерево)', 'Жезл (ядро)'] ['ID фильма', 'Название фильма', 'Год выпуска', 'Время выполнения', 'Бюджет', 'Бокс-офис']
Альтернативой этому подходу (особенно когда у нас нет десятков наборов данных) является реорганизация каждого набора данных в словаре. Это упростит нашу работу, когда нам нужно получить доступ к разным записям:
# Создать словарь из набора данных символов символов_дикт = дикт( столбцы = hp_characters[0], данные = hp_characters[1:] ) # Создать словарь из набора данных фильмов кино_дикт = дикт( столбцы = фильмы [0], данные = фильмы[1:] ) # Доступ к столбцам фильмов и их первой записи print("Столбцы фильмов:") печать (movies_dict ["столбцы"]) Распечатать() print("Первая запись фильмов:") печать (movies_dict ["данные"] [0])
Столбцы фильмов: ['Идентификатор фильма', 'Название фильма', 'Год выпуска', 'Время выполнения', 'Бюджет', 'Бокс-офис'] Первая запись фильмов: ['1', «Гарри Поттер и философский камень», «2001», «152», «125 000 000 долларов», «1 002 000 000 долларов»]
Понимание словаря
Понимание словарей в Python — это элегантный и эффективный метод создания новых словарей. Вы, вероятно, уже узнали кое-что о понимании списка. Просто краткое напоминание: понимание в Python означает применение одной и той же операции к каждому элементу итерации (например, к списку). Давайте проиллюстрируем, как работает эта техника. Например, нам нужен словарь, содержащий время выполнения каждого из фильмов о Гарри Поттере. Давайте создадим его из словаря набора данных фильмов_дикт
:
# Словарь хронометража фильмов время выполнения = {} для фильма в movie_dict["data"]: имя = фильм[1] время выполнения = интервал (фильм [3]) время выполнения [имя] = время выполнения # Показать время выполнения печать (время выполнения)
{«Гарри Поттер и философский камень»: 152, «Гарри Поттер и Тайная комната»: 161, «Гарри Поттер и узник Азкабана»: 142, «Гарри Поттер и Кубок огня»: 157, ' Гарри Поттер и Орден Феникса»: 138, «Гарри Поттер и Принц-полукровка»: 153, «Гарри Поттер и Дары смерти, часть 1»: 146, «Гарри Поттер и Дары смерти, часть 2»: 130 }
Теперь мы хотим преобразовать каждое время выполнения из минут в часы. Прежде всего, мы можем сделать это с помощью обычного цикла for:
.# Словарь для хранения времени выполнения в часах время_часов = {} # Преобразование времени выполнения в часы для k, v в runtimes.items(): runtimes_hours[k] = раунд(v / 60, 2) # Отображение времени работы в часах печать (время_часов)
{«Гарри Поттер и философский камень»: 2.53, «Гарри Поттер и Тайная комната»: 2.68, «Гарри Поттер и узник Азкабана»: 2.37, «Гарри Поттер и Кубок огня»: 2.62, ' Гарри Поттер и Орден Феникса»: 2.3, «Гарри Поттер и Принц-полукровка»: 2.55, «Гарри Поттер и Дары смерти, часть 1»: 2.43, «Гарри Поттер и Дары смерти, часть 2»: 2.17 }
Однако мы можем упростить приведенный выше код, создав словарь среды выполнения всего в одной строке:
print({k:round(v / 60, 2) для k, v в runtimes.items()})
{«Гарри Поттер и философский камень»: 2.53, «Гарри Поттер и Тайная комната»: 2.68, «Гарри Поттер и узник Азкабана»: 2.37, «Гарри Поттер и Кубок огня»: 2. 62, ' Гарри Поттер и Орден Феникса»: 2.3, «Гарри Поттер и Принц-полукровка»: 2.55, «Гарри Поттер и Дары смерти, часть 1»: 2.43, «Гарри Поттер и Дары смерти, часть 2»: 2.17 }
Давайте разберем код выше. Во-первых, посмотрите, где сейчас находится цикл for: мы все еще проходим по элементам словаря runtimes
. Теперь обратите внимание на фигурные скобки: мы пишем код внутри словаря! k
— текущий ключ нашего цикла for, а после двоеточия (:
) выполняем операцию округления и деления на 60 непосредственно на v
, что и является значением цикла for.
Этот код выполняет точно такие же операции, как и раньше, но в 1 строку вместо 3 строк.
Кроме того, мы можем добавить условные операторы. Допустим, мы хотим исключить фильмы короче 2,5 часов:
.print({k:round(v/60, 2) для k, v в runtimes.items() if (v/60) >= 2,5})
{«Гарри Поттер и философский камень»: 2.53, «Гарри Поттер и Тайная комната»: 2. 68, «Гарри Поттер и Кубок огня»: 2.62, «Гарри Поттер и Принц-полукровка»: 2.55}
Мы просто добавляем оператор if, и все.
Понимание словаря также работает с ключами аналогичным образом. Попробуй сам!
Обратите внимание: если у нас есть несколько условных операторов или сложных операций, лучше использовать обычный цикл for, потому что понимание словаря может превратиться в непонятные джунгли кодирования, что подрывает преимущества читабельности Python.
Словарь Python против списка: что лучше?
Теперь, когда мы знаем больше о словарях Python, пришло время сравнить словари и списки. Как лучше? Ни один из них не лучше другого, но они полезны в различных задачах кодирования.
Правила выбора одной из этих структур данных на самом деле довольно просты:
- Если вам просто нужна последовательность элементов, к которым можно получить доступ с помощью индексации, выберите список.
- Если вам нужно быстро получить доступ к элементу, сопоставленному с конкретным уникальным ключом, выберите словарь.
Есть еще кое-что. Словари намного быстрее , если мы хотим получить доступ к определенному элементу, потому что они имеют постоянное время выполнения, что означает, что время выполнения не зависит от размера входного объекта. Напротив, когда мы хотим увидеть, существует ли элемент в списке, время выполнения будет зависеть от размера этого списка (Python перебирает весь список в цикле). Посмотрите на примеры:
время импорта # Создать список lst = [ele для ele в диапазоне (10 ** 7)] сейчас = время.время() если 3 в списке: печать (правда) list_runtime = time.time() - сейчас print(f"\nВремя выполнения списка: {list_runtime} секунд.")
Правда Время выполнения списка: 0,00010442733764648438 секунд.
# Создать словарь d = {i:i*2 для i в диапазоне (10**7)} сейчас = время.время() если 3 в d.keys(): печать (правда) dict_runtime = time.time() — сейчас print(f"\nВремя выполнения словаря: {dict_runtime} секунд.")
Правда
Время работы словаря: 9. 5126152344e-05 секунд.
print(f"Разница во времени выполнения между словарем и списком: {list_runtime - dict_runtime} секунд.")
Разница во времени выполнения между словарем и списком: 9,298324584960938e-06 секунд.
Может показаться, что разница незначительна, но по мере увеличения размера ввода разница будет стремительно расти.
Приведем более конкретный пример. Часто нам нужно получить доступ к определенному элементу либо в списке, либо в словаре. Чтобы найти этот элемент в списке, нам сначала нужно перебрать весь список, а в словаре мы можем быстро получить доступ к тому же элементу, используя его уникальный ключ. Давайте найдем
00 в списке и словаре, определенном выше.
# Найти000 в списке сейчас = время.время() для я в списке: если я ==
000: ломать list_runtime = time.time() - сейчас print(f"\nВремя выполнения списка: {list_runtime} секунд.")
Время выполнения списка: 0,27323484420776367 секунд.
# Найти значение000 в словаре сейчас = время.время() число = д[
00] dict_runtime = time.time() — сейчас print(f"\nВремя выполнения словаря: {dict_runtime} секунд.")
Время выполнения словаря: 3,62396240234375e-05 секунд.
print(f"Разница во времени выполнения между словарем и списком: {list_runtime - dict_runtime} секунд." print(f"\nСловарь быстрее в {(list_runtime / dict_runtime) * 100} раз!")
Разница во времени выполнения между словарем и списком: 0,27319860458374023 секунды. Словарь быстрее в 753967,1052631579 раз!
Словарю почти не потребовалось времени, чтобы найти номер, в то время как списку потребовалось около 1 секунды, чтобы выполнить ту же операцию. Словарь почти в миллион раз быстрее!
Бонус: использование
defaultdict()
для обработки отсутствующих ключей Вспомним, что мы использовали метод setdefault()
для вставки ключа по умолчанию и его значения в словарь. Мы также использовали метод get()
для возврата значения по умолчанию для несуществующего ключа. Более питонический способ выполнения подобных операций — использование defaultdict()
из коллекций
module(). Мы можем инициализировать словарь с типом данных значения по умолчанию, вызвав его и передав нужный тип данных методу. Теперь, если мы попытаемся получить доступ к отсутствующему ключу, словарь создаст этот ключ и сопоставит с ним значение по умолчанию:
# Импорт defaultdict из коллекций импортировать defaultdict # Инициализировать словарь по умолчанию с типом данных list default_d = defaultdict(список) # Вызов отсутствующей клавиши печать (default_d ["отсутствует_ключ"])
[]
Здесь метод создал ключ missing_key
и присвоил ему пустой список, потому что это значение по умолчанию для нашего словаря. Теперь мы можем добавить некоторые значения в этот список:
# Добавляем значения кmissing_key для я в диапазоне (1, 6): default_d["отсутствует_ключ"]. append(f"значение{i}") # Вызов "missing_key" печать (default_d ["отсутствует_ключ"]) Распечатать() # Показать default_d печать (default_d)
['значение1', 'значение2', 'значение3', 'значение4', 'значение5'] defaultdict(, {'missing_key': ['value1', 'value2', 'value3', 'value4', 'value5']})
Аргументы, которые мы передаем в defaultdict()
, должны быть вызываемыми . Если мы передадим невызываемый объект в defaultdict()
, мы получим TypeError
:
default_d = defaultdict(0)
-------------------------------------------------- -------------------------- TypeError Traceback (последний последний вызов) ~\AppData\Local\Temp/ipykernel_10024/35701.py в ----> 1 default_d = defaultdict(0) TypeError: первый аргумент должен быть вызываемым или None
Напротив, мы можем передать любой объект методу setdefault()
:
д = {} д.setdefault (0, 0) печать (д)
{0:0}
Давайте также рассмотрим метод get()
. Мы используем его, когда хотим вернуть значение ключа, который, как мы подозреваем, не существует. Этот метод вернет только значение, но никак не изменит словарь:
# Вернуть значение по умолчанию отсутствующего ключа печать (d.get (3, "три")) Распечатать() # Дисплей д печать (д)
три {0: 0}
Теперь мы должны понять разницу между этими тремя методами.
Заключение
Вот что мы рассмотрели в этом руководстве:
- Словари на Python
- Как словари позволяют нам быстро получить доступ к определенному объекту Python
- Создание словаря методом
dict()
или фигурными скобками - Методы словаря Python
- Циклический просмотр словаря
- Создание таблиц частот
- Вложенные словари
- Понимание словаря
- Когда использовать список или словарь
- Использование
defaultdict()
для обработки отсутствующих ключей
Свяжитесь со мной через LinkedIn или GitHub.