>>> pythons = {'Chapman': 'Graham', 'Cleese': 'John',
'Jones': 'Terry', 'Palin': 'Michael'}
Теперь проверим, кого мы добавили:
>>> 'Chapman' in pythons
True
>>> 'Palin' in pythons
True
Вспомнили ли мы о Терри Гиллиаме на этот раз?
>>> 'Gilliam' in pythons
False
Черт.
Получение элемента словаря с помощью конструкции [ключ]
Этот вариант использования словаря — самый распространенный. Вы указываете словарь и ключ, чтобы получить соответствующее значение:
>>> pythons['Cleese']
'John'
Если ключа в словаре нет, будет сгенерировано исключение:
>>> pythons['Marx']
Traceback (most recent call last):
··File "<stdin>", line 1, in <module>
KeyError: 'Marx'
Есть два хороших способа избежать возникновения этого исключения. Первый из них — проверить, имеется ли заданный ключ, с помощью ключевого слова in, что вы уже видели в предыдущем разделе:
>>> 'Marx' in pythons
False
Второй способ — использовать специальную функцию словаря get(). Вы указываете словарь, ключ и опциональное значение. Если ключ существует, вы получите связанное с ним значение:
>>> pythons.get('Cleese')
'John'
Если такого ключа нет, получите опциональное значение, если указывали его:
>>> pythons.get('Marx', 'Not a Python')
'Not a Python'
В противном случае будет возвращен объект None (интерактивный интерпретатор не выведет ничего):
>>> pythons.get('Marx')
>>>
Получение всех ключей с помощью функции keys()
Вы можете использовать функцию keys(), чтобы получить все ключи словаря. Для следующих примеров мы берем другой словарь:
>>> signals = {'green': 'go', 'yellow': 'go faster', 'red': 'smile for the camera'}
>>> signals.keys()
dict_keys(['green', 'red', 'yellow'])
В Python 2 функция keys() возвращает простой список. В Python 3 эта функция возвращает dict_keys() — итерабельное представление ключей. Это удобно для крупных словарей, поскольку не требует времени и памяти для создания и сохранения списка, которым вы, возможно, даже не воспользуетесь. Но зачастую вам нужен именно список. В Python 3 надо вызвать функцию list(), чтобы преобразовать dict_keys в список:
>>> list(signals.keys())
['green', 'red', 'yellow']
В Python 3 вам также понадобится использовать функцию list(), чтобы преобразовать результат работы функций values() и items() в обычные списки. Я пользуюсь этой функцией в своих примерах.
Получение всех значений с помощью функции values()
Чтобы получить все значения словаря, используйте функцию values():
>>> list(signals.values())
['go', 'smile for the camera', 'go faster']
Получение всех пар «ключ — значение» с помощью функции items()
Когда вам нужно получить все пары «ключ — значение» из словаря, используйте функцию items():
>>> list(signals.items())
[('green', 'go'), ('red', 'smile for the camera'), ('yellow', 'go faster')]
Каждая пара будет возвращена как кортеж вроде ('green', 'go').
Присваиваем значения с помощью оператора =, копируем их с помощью функции copy()
Как и в случае со списками, если вам нужно внести в словарь изменение, оно отразится для всех имен, которые ссылаются на него.
>>> signals = {'green': 'go', 'yellow': 'go faster', 'red': 'smile for the camera'}
>>> save_signals = signals
>>> signals['blue'] = 'confuse everyone'
>>> save_signals
{'blue': 'confuse everyone', 'green': 'go',
'red': 'smile for the camera', 'yellow': 'go faster'}
Чтобы скопировать ключи и значения из одного словаря в другой и избежать этого, вы можете воспользоваться функцией copy():
>>> signals = {'green': 'go', 'yellow': 'go faster', 'red': 'smile for the camera'}
>>> original_signals = signals.copy()
>>> signals['blue'] = 'confuse everyone'
>>> signals
{'blue': 'confuse everyone', 'green': 'go',
'red': 'smile for the camera', 'yellow': 'go faster'}
>>> original_signals
{'green': 'go', 'red': 'smile for the camera', 'yellow': 'go faster'}
Множества
Множество похоже на словарь, значения которого опущены. Он имеет только ключи. Как и в случае со словарем, ключи должны быть уникальны. Если вам нужно прикрепить к ключу некую информацию, воспользуйтесь словарем.
Раньше кое-где теорию множеств преподавали в начальной школе наряду с основами математики. Если в вашей школе такого не было (или было, но вы в это время смотрели в окно, как и я), на рис. 3.1 можете увидеть объединения и пересечения множеств.