ПОЛУЧИТЕ ЦЕННЫЕ НАВЫКИ
5 советов экспертов, которые помогут вам значительно улучшить свои словарные навыки на Python 🚀
Думаете, вы понимаете словари на Python?
Обзор вашего путешествия
- Подготовка сцены
- Краткий обзор - Основы
- Совет 1 - Итерация со словарями
- Совет 2 - Уверенное признание ценностей
- Совет 3 - Словарь терминов
- Совет 4 - Использование функции Zip
- Совет 5 - Объединение словарей
- Подведение итогов
Подготовка сцены
Словарь - одна из фундаментальных структур данных в Python. Вы используете его для подсчета, группировки и выражения отношений. Но не все знают, как эффективно пользоваться словарями.
Плохое использование словарей часто приводит к длинному коду, медленному коду и даже незначительным ошибкам 😧
Когда я начинал с Python, я едва мог получить доступ к данным из словаря и получить их. Но через несколько лет я пришел к выводу, что очень важно хорошо разбираться в словарях.
По словам одного из основных разработчиков Python:
В мире есть два типа людей: люди, владеющие словарями, и полные губеры. - Раймонд Хеттингер
Не будь глупцом! В этом блоге я покажу вам 5 советов, как поднять ваши словарные навыки в Python до уровня профессионалов 🔥
Краткое резюме - основы
Стандартный способ создания словарей - это синтаксис:
# Creating an empty dictionary empty_dict = {} # Standard way to create a dictionary better_call_saul = {"Jimmy": 33, "Kim": 31, "Gus": 44} # Can use the dictionary constructor function better_call_saul = dict([("Jimmy", 33), ("Kim", 31), ("Gus", 44)])
В приведенном выше коде:
- Имена
Jimmy
,Kim
иGus
являются ключами словаря. - Возраст
33
,31
и44
- это значения словаря. - Пары
"Jimmy": 33
,“Kim": 31
и"Gus": 44
являются парами "ключ-значение".
Вы можете получить доступ к значениям из словаря better_call_saul
с помощью синтаксиса
# Getting Kim's age print(better_call_saul["Kim"]) Output: 31 # Setting Jimmy's age better_call_saul["Jimmy"] = 34
Как видно из приведенного выше кода, словари изменяемы. Ключи в словаре также должны быть разными.
Вы можете легко добавлять или удалять пары ключ-значение с помощью словарей:
# Setting a new key-value pair better_call_saul["Jonathan"] = 54 # Removing the key-value pair again (sorry Jonathan!) del better_call_saul["Jonathan"]
Наконец, не каждый объект Python может быть ключом в словаре. Точное правило состоит в том, что объект должен быть хешируемым. Будьте уверены, что любой неизменяемый объект может быть хеширован. Более подробное объяснение хеширования можно найти в блоге:
Совет 1. Итерация со словарями
Первое, что вам следует знать, это то, что начиная с версии Python 3.7 словари упорядочены:
Когда вы распечатываете словарь или перебираете его элементы, вы увидите элементы в том же порядке, в котором они были добавлены в словарь - Эрик Маттес, Python Crash Course
Итерации по ключам
Чтобы перебирать ключи словаря, вы можете использовать метод keys()
:
better_call_saul = {"Jimmy": 33, "Kim": 31, "Gus": 44} for name in better_call_saul.keys(): print(name) Output: Jimmy Kim Gus
Как видите, с помощью метода keys()
вы получаете доступ к ключам словаря. Но ждать! Также можно написать:
for name in better_call_saul: print(name) Output: Jimmy Kim Gus
Если вы выполняете итерацию по словарю, то по умолчанию будет выполняться итерация по ключам 😎
Итерации по значениям
Если вы хотите перебирать значения словаря, вам следует использовать метод values()
:
better_call_saul = {"Jimmy": 33, "Kim": 31, "Gus": 44} # Calculating the total age of the characters total = 0 for age in better_call_saul.values(): total += age print(total) Output: 108
Итерации по ключам и значениям
Если вам нужны и ключи, и значения в итерации, вам следует использовать метод items()
. Давайте сначала посмотрим, что он возвращает:
print(better_call_saul.items()) Output: dict_items([('Kim', 31), ('Gus', 44)])
Результатом является объект dict_items. Такие объекты работают так же, как список кортежей. Таким образом, вы можете использовать синтаксис:
better_call_saul = {"Jimmy": 33, "Kim": 31, "Gus": 44} for name, age in better_call_saul.items(): print(f"{name} is {age} years old.") Output: Jimmy is 33 years old. Kim is 31 years old. Gus is 44 years old.
Совет 2 - Уверенное признание ценностей
Рассмотрим код:
better_call_saul = {"Jimmy": 33, "Kim": 31, "Gus": 44} young_guy_age = better_call_saul["Nacho"] Result: KeyError: 'Nacho'
Вы получили KeyError
, потому что ключа “Nacho”
нет в словаре better_call_saul
. Ой
На самом деле это довольно реалистично. Часто у вас нет полного контроля над тем, что находится в вашем словаре. Данные в вашем словаре могут быть получены из
- парсинг веб-страниц,
- API,
- или загрузка данных.
Если ваша программа выйдет из строя, это причинит вам массу боли. Вместо этого вы можете использовать метод get()
:
young_guy_age = better_call_saul.get("Nacho", "Can't find") print(young_guy_age) Output: Can't find
Метод get()
принимает два аргумента:
- Ключ, для которого вы хотите получить соответствующее значение.
- Значение по умолчанию, если ключ не существует в словаре.
Если вы не укажете второй аргумент для метода get()
, тогда второй аргумент будет по умолчанию None
. Использование метода get()
сделает ваш код более надежным за счет избежания множества ошибок KeyErrors.
Подсказка. Метод, связанный с
get()
, - это методsetdefault()
. Оба метода великолепны, и вам также стоит взглянуть на setdefault.
Совет 3 - Словарь терминов
Вы, наверное, знаете о понимании списков. Понимание списков - это питонический способ построения списков. Вы используете их как мощную альтернативу стандартным циклам:
# Gives the square numbers from 0 to 9 squares = [] for num in range(10): squares.append(num ** 2) # List comprehensions do the same thing! squares = [num ** 2 for num in range(10)]
Знаете ли вы, что Python также поддерживает понимание словаря? Если вам нужен быстрый способ создать словарь, не ищите дальше:
# Manually making a squares dictionary squares = {0:0, 1:1, 2:4, 3:9, 4:16, 5:25, 6:36, 7:49, 8:64, 9:81} # Dictionary comprehensions do the same thing! squares = {num: num ** 2 for num in range(10)}
В качестве другого примера рассмотрим список имен:
names = ["Jimmy", "Kim", "Gus"]
Допустим, вы хотите создать словарь, в котором:
- Ключи словаря - это имена в списке
names
. - Значения словаря - это длины имен.
Вы можете сделать это в одной строке с пониманием словаря!
length_of_names = {name: len(name) for name in names} print(length_of_names) Output: {'Jimmy': 5, 'Kim': 3, 'Gus': 3}
Совет 4 - Использование функции Zip
Распространенная проблема - это два отдельных списка, которые вы хотите объединить в словарь. В качестве примера предположим, что у вас есть следующие два списка:
names = ["Jimmy", "Kim", "Gus"] ages = [33, 31, 44]
Как вы можете объединить names
и ages
, чтобы сформировать словарь better_call_saul
из прошлого? Прежде чем я покажу вам волшебный трюк, давайте проверим, работает ли простой подход:
# The "enumerate" approach better_call_saul = {} for idx, name in enumerate(names): better_call_saul[name] = ages[idx]
Неплохо! В таких случаях часто бывает полезна функция enumerate
.
Тем не менее, есть еще более удобный способ сделать это: использовать функцию zip
с конструктором dict
!
# The "zip" approach better_call_saul = dict(zip(names, ages))
Застежка-молния работает как застежка-молния на куртке - объединяет объекты от начала до конца.
Значение zip(names, ages)
- это объект zip, поэтому понять его непросто. Но если превратить его в список, он станет более сговорчивым:
print(list(zip(names, ages))) Output: [('Jimmy', 33), ('Kim', 31), ('Gus', 44)]
Это похоже на то, что конструктор dict
может съесть! Вам даже не нужно превращать zip-объект в список перед использованием dict
конструктора 😍
Интересный факт: Подход «zip» значительно быстрее, чем подход «enumerate», с точки зрения скорости выполнения.
Совет 5 - Объединение словарей
Иногда возникает необходимость объединить два словаря. Объединение словарей объединяет элементы из двух словарей в один словарь.
Есть много способов выполнить слияние словарей в Python:
- Я покажу вам один из традиционных способов объединения словарей с помощью метода
update()
. - Я покажу вам удивительные операторы слияния словарей, представленные в Python 3.9.
Слияние с методом обновления
Допустим, у вас есть два словаря:
better_call_saul = {"Jimmy": 33, "Kim": 31, "Gus": 44} breaking_bad = {"Walter": 46, "Jesse": 23, "Jimmy": 38}
Если вы хотите объединить словари, вы можете использовать метод update()
:
# Updates better_call_saul better_call_saul.update(breaking_bad) print(better_call_saul) Output: {'Jimmy': 38, 'Kim': 31, 'Gus': 44, 'Walter': 46, 'Jesse': 23}
Вы обновили better_call_saul
новой информацией из breaking_bad
. Обратите внимание, что ключ “Jimmy”
имеет значение 38. Предыдущее значение 33 было переопределено.
Слияние с оператором слияния словарей (Python 3.9+)
В Python 3.9 были введены операторы слияния словарей |
и |=
. Оба они упрощают объединение словарей. Если у вас снова есть словари better_call_saul
и breaking_bad
из предыдущих
better_call_saul = {"Jimmy": 33, "Kim": 31, "Gus": 44} breaking_bad = {"Walter": 46, "Jesse": 23, "Jimmy": 38}
тогда вы можете написать:
better_call_saul |= breaking_bad print(better_call_saul) Output: {'Jimmy': 38, 'Kim': 31, 'Gus': 44, 'Walter': 46, 'Jesse': 23}
Оператор |=
- это оператор слияния словаря на месте. Он изменяет словари на месте. Вы можете использовать оператор объединения словарей |
, если вам нужен новый словарь с объединенным содержанием:
better_call_saul = {"Jimmy": 33, "Kim": 31, "Gus": 44} breaking_bad = {"Walter": 46, "Jesse": 23, "Jimmy": 38} gilligan_universe = better_call_saul | breaking_bad print(gilligan_universe) Output: {'Jimmy': 38, 'Kim': 31, 'Gus': 44, 'Walter': 46, 'Jesse': 23}
Новый синтаксис, представленный в Python 3.9, отлично подходит, если вам нужно объединить более двух словарей.
Заключение
Теперь вы можете подходить к будущим проектам с чванливостью человека, разбирающегося в словарях!
Нравится мой текст? Прочтите мои сообщения в блоге Подсказки по типу, Форматирование черным и Подчеркивание в Python, чтобы узнать больше о Python. Если вы интересуетесь наукой о данных, программированием или чем-то средним, то не стесняйтесь добавить меня в LinkedIn и поздороваться ✋