В этой статье я разбираю Словари в Python 3. Вы узнаете, какими свойствами обладают словари и как можно с ними работать.
Свойства словарей
Я уже писал про последовательности и множества в Python 3. Словарь — наиболее гибкий тип данных в Python. Если списки и кортежи можно рассматривать как упорядоченные коллекции объектов, то словари — неупорядоченные коллекции. То есть элементы словаря не индексируются и обратиться к ним по индексу не получится.
Создавая элемент словаря вам нужно задать ему ключ. Затем к созданному элементу можно обращаться по этому ключу. Создаётся словарь с помощью фигурных скобок:
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} print(my_dict['name']) ### Исполнение Alex
Чем-то напоминает json.
Основные свойства словарей:
- так как словарь не является последовательностью, то некоторые операции не поддерживаются:
- обращение по индексу и срезы;
- конкатенация и повторение;
- словарь это изменяемый объект, то есть добавлять, изменять и удалять элементы словаря можно;
- ключи не обязаны всегда быть строками, можно использовать и числа.
С помощью функции len(), можем узнать количество элементов в словаре:
### Код my_dict = {'name': 'Alex', 'date': '12.05.1985'} print(len(my_dict)) ### Исполнение 2
Работа со словарями в Python
Вывод значения по его ключу я уже показывал выше, но что будет, если искомого ключа в словаре не окажется:
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} print(my_dict['ip']) ### Исполнение Traceback (most recent call last): File "test2.py", line 2, in <module> print(my_dict['ip']) ~~~~~~~^^^^^^ KeyError: 'ip'
Чтобы избежать ошибку, лучше извлекать данные из словаря с помощью метода get:
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} print(my_dict.get('ip')) print(my_dict.get('name')) ### Исполнение None Alex
Метод get позволяет указать значение по умолчанию, оно будет выводиться вместо None, если ключ отсутствует:
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} print(my_dict.get('ip', 'Нет такого ключа')) ### Исполнение Нет такого ключа
Можно вывести все ключи с помощью метода keys(), или все значения с помощью метода values(). Или можно вывести кортежи в виде пар «ключ : значение», с помощью метода items():
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} print(my_dict.keys()) print(my_dict.values()) print(my_dict.items()) ### Исполнение dict_keys(['name', 'date']) dict_values(['Alex', '12.05.1985']) dict_items([('name', 'Alex'), ('date', '12.05.1985')])
Преобразуя вывод items() в список, получим список кортежей:
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} print(list(my_dict.items())) ### Исполнение [('name', 'Alex'), ('date', '12.05.1985')]
В примере выше получился действительно список кортежей, и к его элементам можно обращаться по индексу:
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} print(list(my_dict.items())[0]) print(list(my_dict.items())[0][1]) ### Исполнение ('name', 'Alex') Alex
Добавить элемент в словарь можно таким способом:
### Код my_dict = {'name' : 'Alex', 'date' : '12.05.1985'} my_dict['position'] = 'IT engineer' print(my_dict) ### Исполнение {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'}
Удалить элемент из словаря можно с помощью метода pop():
### Код my_dict = {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'} my_dict.pop('position') print(my_dict) ### Исполнение {'name': 'Alex', 'date': '12.05.1985'}
А чтобы не возникла ошибка, если удаляемого ключа нет в словаре, можно методу pop() задать дополнительный параметр:
### Код my_dict = {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'} my_dict.pop('ip') print(my_dict) ### Исполнение Traceback (most recent call last): File "test2.py", line 2, in <module> my_dict.pop('ip') KeyError: 'ip' ### Код my_dict = {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'} my_dict.pop('ip', None) print(my_dict) ### Исполнение {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'} ### Код # Введённый мною элемент (None), будет выведен в консоль, если мы используем функцию print()) # Вместо None можно было задать любой другой объект, например строку my_dict = {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'} print(my_dict.pop('ip', None)) ### Исполнение None
Так как словарь это изменяемый объект, нужно быть аккуратным с присвоением двум переменным одного словаря:
### Код my_dict = {'name': 'Alex', 'date': '12.05.1985'} my_dict2 = my_dict my_dict2['position'] = 'IT engineer' print(my_dict) ### Исполнение {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'}
Чтобы этого избежать, словарь можно копировать с помощью метода copy():
### Код my_dict = {'name': 'Alex', 'date': '12.05.1985'} my_dict2 = my_dict.copy() my_dict2['position'] = 'IT engineer' print(my_dict) print(my_dict2) ### Исполнение {'name': 'Alex', 'date': '12.05.1985'} {'name': 'Alex', 'date': '12.05.1985', 'position': 'IT engineer'}
А если у нас в словаре содержится ещё один словарь, то простым копированием не отделаться:
### Код my_dict = {'name': 'Alex', 'date': '12.05.1985', 'network' : {'ip' : '192.168.0.12', 'gateway' : '192.168.0.1'} } my_dict2 = my_dict.copy() my_dict2['network']['ip'] = '192.168.0.13' print(my_dict) print(my_dict2) ### Исполнение {'name': 'Alex', 'date': '12.05.1985', 'network': {'ip': '192.168.0.13', 'gateway': '192.168.0.1'}} {'name': 'Alex', 'date': '12.05.1985', 'network': {'ip': '192.168.0.13', 'gateway': '192.168.0.1'}}
При простом копировании у нас не копируется вложенный словарь, копируется лишь ссылка на него. Поэтому когда мы изменяем вложенный словарь, то изменяем его в обоих словарях.
Чтобы этого избежать, существует глубокое копирование. Это метод deepcopy() модуля copy:
### Код import copy my_dict = {'name': 'Alex', 'date': '12.05.1985', 'network' : {'ip' : '192.168.0.12', 'gateway' : '192.168.0.1'} } my_dict2 = copy.deepcopy(my_dict) my_dict2['network']['ip'] = '192.168.0.13' print(my_dict) print(my_dict2) ### Исполнение {'name': 'Alex', 'date': '12.05.1985', 'network': {'ip': '192.168.0.12', 'gateway': '192.168.0.1'}} {'name': 'Alex', 'date': '12.05.1985', 'network': {'ip': '192.168.0.13', 'gateway': '192.168.0.1'}}
Итог
Словари — достаточно интересный тип данных в Python. Словарь может содержать вложенные словари или списки и допускает большую вложенность. Объект типа «Словарь» изменяемый, поэтому этот объект можно изменять — добавляя, изменяя или удаляя элементы. Некоторые особенности словарей можете посмотреть здесь.