Python. Словари. Основные понятия. Характеристики. Создание словарей. Доступ к значениям в словаре




Словари. Основные понятия. Характеристики. Создание словарей. Доступ к значениям в словаре


Содержание


Поиск на других ресурсах:

1. Особенности словарей. Преимущества применения

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

Преимущества применения словарей:

  • с помощью словарей можно разрабатывать эффективные структуры данных;
  • для словарей не нужно писать вручную алгоритмы поиска данных, поскольку эти операции уже реализованы;
  • словари могут содержать объединенные данные в виде записей;
  • словари эффективны при представлении разреженных структур данных.

Основные характеристики словарей следующие:

  • в словарях доступ к элементам выполняется по ключу, а не по индексу. Словари определяют взаимосвязь пар ключ:значение. По ключу происходит доступ к значению. Если в словаре реализовывать доступ к значению по индексу, то в этом случае индекс представляет собой ключ, а не смещение относительно начала;
  • словари представляют неупорядоченные коллекции произвольных объектов. В словарях элементы (ключи) сохраняются в неопределенном порядке. Порядок формирования элементов в словаре определяет интерпретатор. Это необходимо для обеспечения более быстрого поиска.
  • словари имеют переменную длину. Количество элементов в словаре может увеличиваться или уменьшаться;
  • гетерогенность – словари могут содержать объекты любых типов;
  • произвольное количество вложений – словари имеют возможность создания произвольного количества уровней вложений, поскольку словари могут содержать списки, другие словари и т.п.;
  • словари относятся к категории изменяемых объектов. Поэтому, в словарях нет смысла использовать операции которые имеют фиксированный порядок следования элементов (например, конкатенация);
  • словари являются таблицами ссылок на объекты или хеш-таблицами и относятся к отображаемым объектам. Это означает, что в словарях объекты отображают (представляют) ключи на значение.

 

2. Отличия между словарями и списками

Между словарями и списками существуют следующие основные отличия:

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

 

3. Операции и методы обработки словарей. Перечень

В языке Python существует огромное разнообразие операций и методов для обработки словарей. Все эти средства вкратце перечислены здесь:

  • стандартный метод len() – определяет количество элементов в списке;
  • операция D[key] – доступ к элементу словаря D по значению ключа key;
  • операция del – удаление элемента по ключу;
  • операции in, not in – определения наличия или отсутствия ключа в словаре;
  • метод iter() – получить итератор по ключам словаря;
  • метод clear() – удалить все элементи из словаря;
  • метод copy() – вернуть копию словаря;
  • метод dict.fromkeys() – создать новый словарь из ключей и значений;
  • метод get() – получить значение по ключу;
  • метод items() – вернуть представление элементов словаря;
  • метод keys() – получить новое представление ключей словаря;
  • метод pop() – удаление элементов из словаря с возвратом значения;
  • метод popitem() – вытягивание из словаря произвольной пары ключ:значение;
  • метод setdefault() – установить элемент по умолчанию;
  • метод update() – обновление словаря по заданному списку пар ключ:значение;
  • метод values() – получить список значений из словаря.

Более подробно использование вышеперечисленных операций и методов можно изучить в темах:

 

4. Особенности представления ключей числовыми типами

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

  • при поиске нужного значения по ключу используется простая операция сравнения. Если в качестве ключа указывать значение разных числовых типов, например 1 и 1.0, то такие значения считаются взаимозаменяемыми (обращаются к одному и тому же элементу словаря);
  • представление ключа числовым типом с плавающей запятой не рекомендуется, поскольку значение этих типов есть приближенными. Если в качестве ключа нужно указать числовой тип, то для этого целесообразно использовать целые числовые типы.

 

5. Какие значения не могут использоваться в качестве ключей?

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

 

6. Какие существуют способы создания словаря?

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

  • с помощью оператора присваивания = и фигурных скобок, в которых через запятую размещаются пары ключ:значение;
  • с помощью конструктора dict() класса dict.

 

7. Создание словаря с помощью оператора присваивания =. Примеры

Словарь можно создать удобным (естественном) способом с помощью оператора присваивания =.

# Создание словаря
# с помощью оператора присваивания

# 1. Пустой словарь
A = {}
print('A = ', A)

# 2. Словарь из 3-х элементов
# 2.1. Содержит целочисленные ключи и строки значений
B = { 1:'Mon', 2:'Tue', 3:'Wed', 4:'Thu',
5:'Fri', 6:'Sat', 7:'Sun' }
print('B = ', B)
print('B[2] = ', B[2]) # B[2] =   Tue

# 2.2. Содержит строковые ключи и вещественные значения
C = { 'Pi':3.1415, 'Exp':2.71 }
print('C = ', C)
print('C[Exp] = ', C['Exp']) # C[Exp] =   2.71

# 2.3. Словарь, который содержит наборы значений
D = { 'Table1':[ 1, 2, 4], 'Table2':[ 8, -2, 2.33] }
print('D = ', D)
print('D[Table1] = ', D['Table1']) # D[Table1] = [1, 2, 4]
print('D[Table2] = ', D['Table2']) # D[Table2] = [8, -2, 2.33]

Результат выполнения программы

A = {}
B = {1: 'Mon', 2: 'Tue', 3: 'Wed', 4: 'Thu', 5: 'Fri', 6: 'Sat', 7: 'Sun'}
B[2] = Tue
C = {'Pi': 3.1415, 'Exp': 2.71}
C[Exp] = 2.71
D = {'Table1': [1, 2, 4], 'Table2': [8, -2, 2.33]}
D[Table1] = [1, 2, 4]
D[Table2] = [8, -2, 2.33]

 

8. Создание словаря с помощью конструктора dict(). Пример

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

dict(**keyword_arg)
dict(mapping, **keyword_arg)
dict(iterable, **keyword_arg)

где

  • keyword_arg – необязательный ключевой аргумент. Если конструктор вызывается без ключевого аргумента (например, dict()), то создается пустой словарь. Если в конструкторе задается несколько ключевых аргументов, то они разделяются запятой (в общей форме конструктора использованы символы **);
  • mapping – отображаемый объект, на основе которого создается словарь;
  • iterable – итерированный объект, на основе которого создается словарь.

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

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

Пример. Демонстрируется создание словарей разными способами.

# Создание словаря с помощью конструктора dict
# 1. Разновидность конструктора dict(**keyword_arg)
# 1.1. Создать пустой словарь
A = dict()
print('A = ', A) # A = {}

# 1.2. Создать список
# {'Winter': 1, 'Spring': 2, 'Summer': 3, 'Autumn': 4}
SEASONS = dict( Winter=1, Spring=2, Summer=3, Autumn=4)
print('SEASONS = ', SEASONS)

# ---------------------------------------------------
# 2. Разновидность конструктора dict(mapping, **keyword_arg)
# 2.1. Применение функции zip()
DAYS = [ 1, 2, 3 ]
DAYS_NAMES = [ 'Mon', 'Tue', 'Wed' ]
DICT_DAYS = dict(zip(DAYS, DAYS_NAMES))
print(DICT_DAYS) # {1: 'Mon', 2: 'Tue', 3: 'Wed'}

# 2.2. Использование пар (key:value)
DICT_DAYS = dict([(1,'Mon'), (2,'Tue'), (3,'Wed')])
print(DICT_DAYS) # {1: 'Mon', 2: 'Tue', 3: 'Wed'}

# ---------------------------------------------------
# 3. Разновидность конструктора dict(iterable, **keyword_arg)
#   Применение конструктора по образцу B = {}
B = dict({1:'Mon', 2:'Tue', 3:'Wed'})
print('B = ', B) # B = {1: 'Mon', 2: 'Tue', 3: 'Wed'}

Результат выполнения программы

A = {}
SEASONS = {'Winter': 1, 'Spring': 2, 'Summer': 3, 'Autumn': 4}
{1: 'Mon', 2: 'Tue', 3: 'Wed'}
{1: 'Mon', 2: 'Tue', 3: 'Wed'}
B = {1: 'Mon', 2: 'Tue', 3: 'Wed'}

 

9. Каким образом осуществляется доступ к значению по его ключу?

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

Например.

# Доступ к значению в словаре
# 1. Создать список
# {'Winter': 1, 'Spring': 2, 'Summer': 3, 'Autumn': 4}
SEASONS = dict( Winter=1, Spring=2, Summer=3, Autumn=4)

# 2. Вывести значение по ключу 'Spring'
value = SEASONS['Spring'] # value =   2

# 3. Изменить значение в словаре по его ключу
# Задается словарь с номерами и названиями помещений
D = { 233:'Lecture hall', 234:'Laboratory' }

# Изменение 'Laboratory' на 'Programming laboratory'
D[234] = 'Programming laboratory'

 

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

При работе со словарями, возможна ситуация, когда происходит доступ по ключу, которого нет в словаре. В этом случае в программе возникает ошибка и генерируется исключение KeyError.

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

  • предварительно проверить наличие ключа с помощью конструкции if;
  • использовать блок try-except для обработки исключения KeyError;
  • использовать метод get(), который, в случае несуществующего ключа, возвращает значение по умолчанию.

В примере демонстрируются все три способа.

Пример.

# Словари. Избежание доступа по несуществующему ключу
# Исходный словарь
Days = { 1:'Mon', 2:'Tue', 3:'Wed',
         4:'Thu', 5:'Fri', 6:'Sat', 7:'Sun' }

# 1. Попытка обратиться к несуществующему дню
# day = Days[8] # возникает исключение KeyError: 8

# 2. Способ 1. Обращение к несуществующему дню,
#    использование оператора if
day = int(input("Enter day: "))
if day in Days:    
    print("day = ", Days[day])
else:
    print("1. Using if statement: Error.")

# 3. Способ 2. Обращение к несуществующему ключу,
#    использование конструкции try-except
try:  
    print('day = ', Days[day])
except KeyError:
    print('2. Using try-except statement: Error.')

# 4. Способ 3. Обращение к несуществующему ключу,
#   использование метода get()
print('3. Using get() method: ', Days.get(day))

 

11. Примеры вложенных словарей

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

# Вложенные словари
# Пример 1.
# Внутренний словарь
Worker_Type = { 'Manager':1, 'SupportStaff':2 }

# Внешний словарь
# {'Worker': {'Manager': 1, 'SupportStaff': 2}}
Worker_Dict = { 'Worker' : Worker_Type }
print(Worker_Type)
print(Worker_Dict)

# Пример 2.
Figures = { 'Figure' : { 1:'Circle', 2:'Triangle', 3:'Rombus' } }
print(Figures)

Результат выполнения программы

{'Manager': 1, 'SupportStaff': 2}
{'Worker': {'Manager': 1, 'SupportStaff': 2}}
{'Figure': {1: 'Circle', 2: 'Triangle', 3: 'Rombus'}}

 


Связанные темы