Python Dict

Основы

Введение в тему

В этом уроке мы познакомимся с коллекцией значений Python – dict. Эта структура данных предназначена для хранения данных и ключей, соответствующих каждому из значений. Название dict это сокращение от английского слова «dictionary», что переводится как «словарь». И правда, этот набор данных очень похож на словарь: в левой части строки находится одно, уникальное для всех строк, слово, а в правой его перевод:

 

hello — привет

dictionary – словарь

 

Примерно так же будет выглядеть и dict:

{

'hello' : 'привет',

'dictionary' : 'словарь'

}

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

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

  1. Во-первых, они должны быть уникальными. Представьте эту коллекцию как адресную книгу. В квартире может находиться что угодно, но если в адресной книге будет две квартиры с одинаковым адресом, Вашу пиццу Вам могут и не принести.
  2. Во-вторых, ключи должны быть неизменяемого типа (immutable). Вернёмся к примеру с адресами. Если жильцы начнут менять свои адреса по собственному усмотрению, это приведёт к хаосу. Конечно, адрес может смениться, но для этого есть специальный бюрократический механизм. Так и в Пайтоне: можно извлечь значение. Обратившись по ключу (адресу), удалить ключ, создать другой, и передать туда значение.

И так, объявляем пустой словарь:

example = {}
print(type(example))
# Вывод:

<class 'dict'>

Dict, где ключи имеют целочисленный тип:

example = {1: 'one', 2: 'two', 3: 'three'}
print(example)
# Вывод:

{1: 'one', 2: 'two', 3: 'three'}

А что на счёт разных типов ключей?

example = {1: 'one', 'two': 2, (3, 'three'): 'три'}
print(example)
# Вывод:

{1: 'one', 'two': 2, (3, 'three'): 'три'}

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

В Питоне существует возможность объявлять dict используя функцию dict():

example = dict({1: 'one', 'two': 2, (3, 'three'): 'три'})
print(example)
# Вывод:

{1: 'one', 'two': 2, (3, 'three'): 'три'}

Вы так же можете использовать набор данных:

example = dict(((1, 'one'), ('two', 2), ((3, 'three'), 'три')))
print(example)
# Вывод:

{1: 'one', 'two': 2, (3, 'three'): 'три'}

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

Пример:

example = {1: 'one',
           'two': 2,
           'три': {3: 'three'}}
print(example)
# Вывод:

{1: 'one', 'two': 2, 'три': {3: 'three'}}

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

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

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

example = {1: 'one',
           'two': 2,
           'три': {3: 'three'}}
print(example['три'])

# Вывод:

{3: 'three'}

В языке программирования Python всё является объектами. А у объектов есть методы. Один из методов словаря get(). Этот метод позволяет точно так же, как и в предыдущем примере, получить доступ к значению по его ключу:

example = {1: 'one',
           'two': 2,
           'три': {3: 'three'}}
print(example.get('три'))
# Вывод:

{3: 'three'}

Но, есть всё же и разница. Если Вы попытаетесь получить значение, передав несуществующий ключ в квадратные скобки, интерпретатор вернёт исключение:

example = {1: 'one',
           'two': 2,
           'три': {3: 'three'}}
print(example['four'])
# Вывод:

Traceback (most recent call last):

File "C:/Users/ivand/AppData/Roaming/JetBrains/PyCharm2021.1/scratches/1.py", line 4, in <module>

print(example['four'])

KeyError: 'four'

 

Process finished with exit code 1

Если использовать метод get(), то, в такой же ситуации, вернётся None:

example = {1: 'one',
           'two': 2,
           'три': {3: 'three'}}
print(example.get('four'))
# Вывод:

None

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

Добавить новое значение в словарь можно различными способами. Один из них – указать в квадратных скобках новый ключ и присвоить ему значение. Пример:

example = {1: 'one',
           'two': 2,
           'три': {3: 'three'}}
example['four'] = 4
print(example['four'])
# Вывод:

4

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

example = {1: 'one',
           'two': 2,
           'три': {3: 'three'}}
example['four'] = 4, 'четыре'
print(example['four'])
print(type(example['four']))
# Вывод:

(4, 'четыре')

<class 'tuple'>

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

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

example = {1: 'one',
           'two': 2,
           'три': 3}
print('Начальное содержание словаря:', example)
example['три'] = 3.14
print('Содержание словаря после изменения:', example)
# Вывод:

Начальное содержание словаря: {1: 'one', 'two': 2, 'три': 3}

Содержание словаря после изменения: {1: 'one', 'two': 2, 'три': 3.14}

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

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


example = {1: 'one',
           'two': 2,
           'три': 3}
print('Начальное содержание словаря:', example)
del example['три']
print('Содержание словаря после изменения:', example)
# Вывод:

Начальное содержание словаря: {1: 'one', 'two': 2, 'три': 3}

Содержание словаря после изменения: {1: 'one', 'two': 2}

Ещё один способ удалить элемент словаря – использовать метод pop()с нужным ключом:

example = {1: 'one',
           'two': 2,
           'три': 3}
print('Начальное содержание словаря:', example)
example.pop('три')
print('Содержание словаря после изменения:', example)
# Вывод:

Начальное содержание словаря: {1: 'one', 'two': 2, 'три': 3}

Содержание словаря после изменения: {1: 'one', 'two': 2}

Метод словаря popitem() удаляет последний элемент с конца словаря, в порядке LIFO (последним прибыл — первым выбыл). Пример:

example = {1: 'one',
           'two': 2,
           'три': 3}
print('Начальное содержание словаря:', example)
example.popitem()
print('Содержание словаря после изменения:', example)
# Вывод:

Начальное содержание словаря: {1: 'one', 'two': 2, 'три': 3}

Содержание словаря после изменения: {1: 'one', 'two': 2}

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

example = {1: 'one',
           'two': 2,
           'три': 3}
while example:
    print('Удаляем элемент:', example.popitem())
print('Содержимое словаря после цикла:', example)
# Вывод:

Удаляем элемент: ('три', 3)

Удаляем элемент: ('two', 2)

Удаляем элемент: (1, 'one')

Содержимое словаря после цикла: {}

Обратите внимание, что метод возвращает элемент, который удаляет, в виде кортежа (ключ, значение). Таким же образом ведёт себя и метод pop():

example = {1: 'one',
           'two': 2,
           'три': 3}
print('Удаляем элемент:', example.pop(1))
print('Содержимое словаря после изменения:', example)
# Вывод:

Удаляем элемент: one

Содержимое словаря после цикла: {'two': 2, 'три': 3}

Для удаления всего словаря, как объекта, подходит сочетание ключевого слова del и имени словаря:

example = {1: 'one',
           'two': 2,
           'три': 3}
print('Начальное содержание словаря:', example)
del example
print('Содержание словаря после изменения:', example)
# Вывод:

Начальное содержание словаря: {1: 'one', 'two': 2, 'три': 3}

Traceback (most recent call last):

File "C:/Users/ivand/AppData/Roaming/JetBrains/PyCharm2021.1/scratches/1.py", line 6, in <module>

print('Содержание словаря после изменения:', example)

NameError: name 'example' is not defined

Для того, чтобы очистить словарь (удалить все элементы) Вам понадобится метод clear():

example = {1: 'one',
           'two': 2,
           'три': 3}
print('Начальное содержание словаря:', example)
example.clear()
print('Содержание словаря после изменения:', example)
# Вывод:

Начальное содержание словаря: {1: 'one', 'two': 2, 'три': 3}

Содержание словаря после изменения: {}

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

Функция len

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

example = {1: 'one',
           'two': 2,
           'три': 3}
print('В словаре {} элемента'.format(len(example)))
# Вывод:

В словаре 3 элемента

Начиная с версии Пайтона 3.6 словари упорядочены. Это означает, что у всех элементов есть индексы и они хранятся в строгом порядке следования. Однако, получить доступ к элементу по его номеру совсем не тривиальная задача. Здесь может помочь функция len():

example = {1: 'one',
           'two': 2,
           'три': 3}
for i in range(len(example)):
    print(f'Элемент №{i+1}:', example[list(example.keys())[i]])
# Вывод:

Элемент №1: one

Элемент №2: 2

Элемент №3: 3

Но, это грязный, «хакерский» подход к языку и использовать его мы не рекомендуем. Гораздо проще использовать более подходящие для таких целей структуры данных.

Метод copy

Метод словаря copy() позволяет копировать словарь:

example = {1: 'one',
           'two': 2,
           'три': 3}
example2 = example.copy()
print('Это такой же словарь?')
print(example2 == example)
print('Это тот же словарь?')
print(example2 is example)
# Вывод:

Это такой же словарь?

True

Это тот же словарь?

False

Однако, не забывайте, что это не глубокое копирование:

example = {1: 'one',
           'two': 2,
           'три': [3, 'tree']}
example2 = example.copy()
print(example2)
example['три'][0] = 4
print(example2)
print('Это такой же словарь?')
print(example2 == example)
# Вывод:

{1: 'one', 'two': 2, 'три': [3, 'tree']}

{1: 'one', 'two': 2, 'три': [4, 'tree']}

Это такой же словарь?

True

Если Вам нужно именно глубокое копирование, обратитесь к модулю стандартной библиотеки copy.

Метод items

Если необходимо перебрать элементы словаря, на помощь приходит метод items, который возвращает iterable объект. Он содержит пары ключ-значение словаря, представленные кортежами:


example = {1: 'one',
           'two': 2,
           'три': [3, 'tree']}
for item in example.items():
    print(item)
# Вывод:

(1, 'one')

('two', 2)

('три', [3, 'tree'])

Метод fromkeys

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

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


example = dict.fromkeys([1, 2, 3], 'Здесь может быть Ваша реклама')
print(example)
# Вывод:

{1: 'Здесь может быть Ваша реклама', 2: 'Здесь может быть Ваша реклама', 3: 'Здесь может быть Ваша реклама'}

Метод setdefault

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

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

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

Например:

example = dict.fromkeys([1, 2, 3], 'Здесь может быть Ваша реклама')
print(example.setdefault(1, 'Инвестируйте с BetaBank!'))
print(example.setdefault(4, 'Инвестируйте с BetaBank!'))
# Вывод:

Здесь может быть Ваша реклама

Инвестируйте с BetaBank!

Метод keys

Данный метод возвращает iterable объект, который представляет из себя список ключей, содержащихся в словаре.

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

Например:

example = dict()
for key in range(10):
    example[key] = key*'='
[print(item) for item in example.items()]
print(example.keys())
# Вывод:

(0, '')

(1, '=')

(2, '==')

(3, '===')

(4, '====')

(5, '=====')

(6, '======')

(7, '=======')

(8, '========')

(9, '=========')

dict_keys([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

Выводы

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

Оцените статью
О Python на русском языке
Добавить комментарий

Adblock
detector