ПОЛУЧИТЕ ЦЕННЫЕ НАВЫКИ

5 советов экспертов, которые помогут вам значительно улучшить свои словарные навыки на Python 🚀

Думаете, вы понимаете словари на Python?

Обзор вашего путешествия

Подготовка сцены

Словарь - одна из фундаментальных структур данных в 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() принимает два аргумента:

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

Если вы не укажете второй аргумент для метода 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 и поздороваться ✋