Python с нуля – часть 10: словари

 

PythonСловарь (dictionary) в языке Python является изменяемым (mutable) типом данных, который может содержать в себе любое количество объектов, включая другие типы, такие как словари. Словари состоят из пар ключ:значение .

Так же, их называют “ассоциативными массивами” (associative arrays) или “хеш-таблицами” (hash tables).

Строго говоря – словари не являются последовательностями, т.к. доступ к элементам словаря осуществляется не по индексу, а по ключу.

Синтаксис словаря такой:

>>> dict ={'Alice':'2341','Beth':'9102','Cecil':'3258'}
>>> dict
{'Beth': '9102', 'Alice': '2341', 'Cecil': '3258'}

Создаётся словарь таким образом:

>>> dict1 ={'abc':456};
>>> dict2 ={'abc':123,98.6:37};
>>> print dict1, dict2
{'abc': 456} {98.6: 37, 'abc': 123}

Каждый ключ (key) в словаре отделяется от его значения (value) двоеточием (“:“), а элементы словаря (пара ключ:значение) разделяются запятой. Создать пустой словарь можно просто указав две фигурные скобки, например:

>>> dict = {}
>>> print dict
{}

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

Получения данных из словаря

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

>>> dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
>>>
>>> print "dict['Name']: ", dict['Name'];
dict['Name']:  Zara
>>> print "dict['Age']: ", dict['Age'];
dict['Age']:  7

При попытке получить значение из словаря по ключу, которого не существует – интерпретатор сообщит об ошибке:

>>> dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
>>>
>>> print "dict['Alice']: ", dict['Alice'];
dict['Alice']:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Alice'

Обновление данных в словаре

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

>>> dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
>>>
>>> dict['Age'] = 8; # update existing entry
>>> dict['School'] = "DPS School"; # Add new entry
>>>
>>>
>>> print "dict['Age']: ", dict['Age'];
dict['Age']:  8
>>> print "dict['School']: ", dict['School'];
dict['School']:  DPS School

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

Вы можете либо удалить один элемент в словаре, или полностью очистить его содержимое, либо – полностью удалить словарь:

>>> dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
>>> del dict['Name']; # удаляем запись у которой ключ 'Name'
>>> print dict['Name']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Name'
>>> dict.clear() # удаляем всё содержимое словаря
>>> print dict
{}
>>> dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'};
>>> print dict['Name']
Zara
>>> del dict ;        # удаляем весь словарь
>>> print dict['Name']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'type' object has no attribute '__getitem__'

Свойства ключей в словаре

Для значений в словаре нет никаких ограничений. Они могут являться произвольным объектом языка Python, либо любым другим объектом, заданным пользователем. По другому обстоит дело с ключами.

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

(a) Не допустимо использование более одного ключа в словаре. Если вы укажете два ключа с одинаковым именем – будет использовано то, которые было присвоено позже:

>>> dict = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni'};
>>>
>>> print "dict['Name']: ", dict['Name'];
dict['Name']:  Manni

(b) Ключи должны являться неизменяемыми объектами. Вы можете использовать строки, числа или кортежи в качестве ключей словаря, но нельзя использовать, например, список (который является изменяемым объектом). Т.е. указать, к примеру, ключ как ['key']  – не выйдет:

>>> dict = {['Name']: 'Zara', 'Age': 7};
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>>
>>> print "dict['Name']: ", dict['Name'];
dict['Name']:  Manni

Встроенные функции и методы словарей

В Python имеются такие встроенные функции для работы со словарями:

SN Function with Description
1 cmp(dict1, dict2)
сравнение двух словарей;
2 len(dict)
получение длины словаря – т.е. количество пар ключ:значение (элементов);
3 str(dict)
создаёт строкове представление словаря;
4 type(variable)
возвращает тип переданного объекта; если объект является словарём – вернёт ‘dict’;

В Python имеются такие встроенные методы для работы со словарями:

SN Methods with Description
1 dict.clear()
удаляет все элементы словаря dict;
2 dict.copy()
возвращает копию словаря dict;
3 dict.fromkeys()
создаёт новый словарь с ключами из из переданной последовательности seq;
4 dict.get(key, default=None)
возвращает значение для ключа key, или значение заданное в default, если ключа нет в словаре;
5 dict.has_key(key)
возвращает true, если ключ key присутствует в словаре dict, или false – если нет;
6 dict.items()
возвращает кортеж, содержащий пары ключ:значение словаря dict;
7 dict.keys()
возвращает список ключей словаря dict;
8 dict.setdefault(key, default=None)
подобен методу get(), но утсановит dict[key]=default, если ключ key не найден в словаре;
9 dict.update(dict2)
добавляет пары ключ:значение из словаря dict2 в словарь dict;
10 dict.values()
возвращает список значений из словаря dict;

  • Pavel Rachevsky
     

    “однако ключи должны быть неизменяемым типом, например – список, число или кортеж.”
    Но ведь списки не могут быть ключами в словарях?