В этой статье я разбираю Словари в 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. Словарь может содержать вложенные словари или списки и допускает большую вложенность. Объект типа «Словарь» изменяемый, поэтому этот объект можно изменять — добавляя, изменяя или удаляя элементы. Некоторые особенности словарей можете посмотреть здесь.

Сводка
Python 3. Словари
Имя статьи
Python 3. Словари
Описание
В этой статье я разбираю Словари в Python 3. Вы узнаете, какими свойствами обладают словари и как можно с ними работать

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *