Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Современные средства разработки программного обеспечения. Учебное пособие
.pdf
111
"model": "2106",
"year": 1989
}
car.pop("year")
Пример. Метод popitem() удаляет последний добавленный элемент (в версиях
до 3.7 вместо него удаляется случайный элемент):
car = {
"brand": "Lada",
"model": "2106",
"year": 1989
}
car.popitem()
print(car)
Пример. Ключевое слово del удаляет элемент с указанным именем ключа:
car = {
"brand": "Lada",
"model": "2106",
"year": 1989
}
del car["model"]
print(thisdict)
Пример. Ключевое слово del также может полностью удалить словарь:
car = {
"brand": "Lada",
"model": "2106",
"year": 1989
}
del car
print(car) #это вызовет ошибку, поскольку "car" больше не суще-
ствует.
Пример. Метод clear() очищает словарь:
car = {
"brand": "Lada",
"model": "2106",

112
"year": 1989
}
car.clear()
print(car)
Копирование словаря
Нельзя скопировать словарь, просто набрав dict2 = dict1, потому что: dict2 будет
являться ссылкой на dict1, а изменения, внесенные в dict1, автоматически также будут
внесены в dict2. Т.е. так используют поверхностное клонирование.
Если это не цель, тогда нужно использовать глубокое клонирование.
Способ 1 – использовать встроенный метод словаря copy().
Пример. Создать копию словаря с помощью метода copy():
car = {
"brand": "Lada",
"model": "2106",
"year": 1989
}
newCar = car.copy()
print(newCar)
Способ 2 – использовать конструктор dict().
Пример. Создать копию словаря с помощью функции dict():
car = {
"brand": "Lada",
"model": "2106",
"year": 1989
}
newCar = dict(car)
print(newCar)
Сравнение
Способ 1. Использовать оператор = = для сравнения двух словарей в Python для
определения, идентичны словари или нет.
Пример. Идентичные словари.
dict1 = dict(name="Tom", Vehicle="Benz Car")
dict2 = dict(name="Tom", Vehicle="Benz Car")

113
dict1 == dict2
Вывод:
True
Пример. Неидентичные словари.
dict1 = dict(name="John", Vehicle="Benz Car")
dict2 = dict(name="Tom", Vehicle="Benz Car")
dict1 == dict2
Вывод:
False
Способ 2. Написать пользовательский код для сравнения двух словарей в Python
[34].
Шаги для сравнения словарей с определением количества общих пар между
этими словарями.
- Задать цикл for для обхода каждого элемента в одном из словарей.
- Сравнить каждый элемент этого словаря с другим словарем на основе об-
щего индекса.
- Если элементы равны, то поместить пару key:value в результирующий об-
щий словарь.
- После обхода всего словаря вычислить длину результирующего общего сло-
варя, чтобы определить количество общих элементов между словарями.
Пример. Метод сравнения двух словарей в Python.
В этом случае словари идентичны.
dict1 = dict(name="Tom", Vehicle="Mercedes Car")
dict2 = dict(name="Tom", Vehicle="Mercedes Car")
dict1_len = len(dict1)
dict2_len = len(dict2)
total_dict_count = dict1_len + dict2_len
shared_dict = {}
for i in dict1:
if (i in dict2) and (dict1[i] == dict2[i]):

114
shared_dict[i] = dict1[i]
len_shared_dict = len(shared_dict)
print("Общими элементами в словарях являются -", shared_dict)
print ("Общее количество элементов в словарях равно -",
len_shared_dict)
if len_shared_dict == total_dict_count / 2:
print("Словари идентичны")
else:
print ("Словари не идентичны")
Способ 3. Использование генератора списка для сравнения двух словарей.
Пример. Использовать генератор списка для сравнения двух словарей и про-
верки, существуют ли в словаре одинаковые пары ключ-значение или нет.
d = {"a": 3, "b": 2}
d1 = {"a": 2, "b": 3}
res = all((d1.get(k) == v for k, v in d.items()))
print(res)
Вывод:
False
Вложенные словари
Вложенность словаря означает помещение словаря внутрь другого словаря.
nested_dict = {'dict1': {'key_A': 'value_A'},
'dict2': {'key_B': 'value_B'}}
Пример. Создание вложенного словаря
dict = {'id': '12f', 'Name': 'Ivan', 'Language': {'A': 'Python',
'B': 'Java', 'C': 'PHP'}}

115
Рисунок 8.1 – Вложенный словарь
Добавление элементов во вложенный словарь.
Dict = { }
print("Initial nested dictionary:-")
print(Dict)
Dict['Dict1'] = {}
# Adding elements one at a time
Dict['Dict1']['name'] = 'Bob'
Dict['Dict1']['age'] = 21
print("\nAfter adding dictionary Dict1")
print(Dict)
# Adding whole dictionary
Dict['Dict2'] = {'name': 'Cara', 'age': 25}
print("\nAfter adding dictionary Dict1")
print(Dict)
Вывод:
Initial nested dictionary:-
{}
After adding dictionary Dict1
Словарь
keys
id
Name
Language
values
12f
Ivan
Nested
keys
A
B
C
Ivan
Python
Java
PHP

116
{'Dict1': {'age': 21, 'name': 'Bob'}}
After adding dictionary Dict1
{'Dict1': {'age': 21, 'name': 'Bob'}, 'Dict2': {'age': 25,
'name': 'Cara'}}
Доступ к элементам вложенного словаря
Чтобы получить доступ к значению любого ключа во вложенном словаре, используйте синтаксис индексирования [].
# Nested dictionary having same keys
Dict = { 'Dict1': {'name': 'Ali', 'age': '19'},
'Dict2': {'name': 'Bob', 'age': '25'}}
# Prints value corresponding to key 'name' in Dict1
print(Dict['Dict1']['name'])
# Prints value corresponding to key 'age' in Dict2
print(Dict['Dict2']['age'])
Вывод:
Ali
25
Удаление словарей из вложенного словаря
Удаление словарей из вложенного словаря может быть выполнено либо с помощью ключевого слова Python del, либо с помощью функции pop().
Dict = {'Dict1': {'name': 'Ali', 'age': 19},
'Dict2': {'name': 'Bob', 'age': 21}}
print("Initial nested dictionary:-")
print(Dict)
# Deleting dictionary using del keyword
print("\nDeleting Dict2:-")
del Dict['Dict2']
print(Dict)
# Deleting dictionary using pop function
print("Deleting Dict1:-")
Dict.pop('Dict1')

117
print (Dict)
Вывод:
Initial nested dictionary:-
{'Dict2': {'name': 'Bob', 'age': 21}, 'Dict1': {'name': 'Ali',
'age': 19}}
Deleting Dict2:-
{'Dict1': {'name': 'Ali', 'age': 19}}
Deleting Dict1:-
{}
8.2 Генерация словарей (dictionary comprehensions)
В Python можно создавать словари, используя простые выражения. По сути –
это метод преобразования одного словаря Python (или любого итерируемого типа) в
другой словарь с использованием одной строки кода.
Базовая форма для генерации словаря:
{key: value for (key, value) in iterable}
где:
− key: это выражение, которое определяет ключ для каждой записи словаря
Python.
− value: это выражение, которое предоставляет значение, соответствующее
каждому ключу.
− iterable: любой объект Python, над которым можно выполнять цикл (напри-
мер, список, кортеж, набор и т.д.).
Используя различные варианты итерируемого объекта, можно получить различные способы генерации словарей.
Способ 1. Генерация словаря Python на основе двух списков. Функция zip()
обычно используется для объединения двух списков.
Пример. Генерация словаря Python.

118
Даны два списка с именами ключей и значениями, которые перебирают с помощью функции zip () .
keys = ['a','b','c','d','e']
values = [1,2,3,4,5]
myDict = { k:v for (k,v) in zip(keys, values)}
# myDict = dict(zip(keys, values))
print (myDict)
Вывод :
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
Способ 2. Использование метода fromkeys()
Здесь мы используем метод fromkeys() , который возвращает словарь с определенными ключами и значениями.
dic=dict.fromkeys(range(5), True)
print(dic)
Вывод:
{0: True, 1: True, 2: True, 3: True, 4: True}
Пример. Создать словарь, используя генератор словаря.
# Python code to demonstrate dictionary
# creation using list comprehension
myDict = {x: x**2 for x in [1,2,3,4,5]}
print (myDict)
Вывод:
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
Способ 3. Генерация словаря Python с помощью нескольких ключей [35].
Иногда требуется генерация словаря с несколькими ключами. Здесь генерация
словаря Python используется с несколькими циклами, что позволяет создавать словарь на Python, где каждому ключу может соответствовать несколько значений, часто организованных в виде списков.
Пример. Пусть задан список известных достопримечательностей и соответствующих им городов. Пусть нужно создать словарь на Python, где каждому городу
сопоставлен список его достопримечательностей.
landmarks = [('Statue of Liberty', 'New York'), ('Mount Rush-
more', 'South Dakota'), ('Hollywood Sign', 'California')]

119
landmark_dict = {state: [landmark for landmark, s in landmarks if
s == state] for landmark, state in landmarks}
print(landmark_dict)
Вывод: Здесь генерация словаря по нескольким ключам использует несколько
циклов, чтобы сначала сгенерировать список достопримечательностей для каждого
города, а затем сопоставить их с соответствующими городами.
{'New York': ['Statue of Liberty'], 'South Dakota': ['Mount Rush-
more'], 'California': ['Hollywood Sign']}
Способ 4. Генерация словаря Python с использованием if-else
Включение условного оператора if-else в генерацию словаря позволит: отфильтровывать элементы и/или изменять значения элементов на основе условия. Генератор словаря Python проверяет область каждого состояния и присваивает категорию на основе предоставленных условий if else.
Пример. Есть список городов и их общая площадь. Нужно классифицировать
государства как "Большие", если их площадь превышает 1000000 кв. км., и "Маленькие" в противном случае, используя генератор словаря с if else.
state_area = {'Tyumen region': 1464173, 'Buryatia': 351334, 'Al-
tai': 92903}
area_category = {state: 'Large' if area > 100000 else 'Small' for
state, area in state_area.items()}
print(area_category)
Вывод:
{'Tyumen region': 'Large', 'Buryatia': 'Small', 'Altai': 'Small'}
Способ 5. Генерация словаря Python с помощью defaultdict.
Можно эмулировать понимание defaultdict, объединив defaultdict из модуля
collections с генератором словаря в Python. Это позволит автоматически инициализировать ключи словаря Python значениями по умолчанию, такими как пустые
списки.
Пример. Сгруппировка городов по их начальной букве, используя комбинацию defaultdict и генератор словаря, эмулируя defaultdict.
from collections import defaultdict

120
us_cities = ['Denver', 'Detroit', 'Dallas', 'Boston', 'Balti-
more']
city_dict_default = defaultdict(list)
{city_dict_default[city[0]].append(city) for city in us_cities}
print(dict(city_dict_default))
Вывод:
{'D': ['Denver', 'Detroit', 'Dallas'], 'B': ['Boston', 'Baltimore']}
Способ 6. Генерация словаря Python с заменой ключей и значений
Сгенерировать словарь из заданного, поменяв местами роли ключей и значений в словаре.
Пример. Задан словарь с информацией об автомобильных производителях и
их центральных офисах.
car_manufacturer_location = {
'Ford': 'Dearborn',
'Avtovaz': 'Tolyatti',
'BMW': 'Munich'
}
swapped_dict = {location: manufacturer for manufacturer, location
in car_manufacturer_location.items()}
print(swapped_dict)
Результат:
{'Dearborn': 'Ford', 'Tolyatti': 'Avtovaz', 'Munich': 'BMW'}
Способ 7. Генерация словаря Python из другого словаря
Создание нового словаря на Python на основе существующего путем применения некоторых операций или фильтрации.
Пример. Дан словарь Python для среднемесячных температур в градусах Цель-
сия для различных городов, и нам нужен словарь только с теми городами, где средняя температура выше 25.
avg_temps = {
'Sydney': 18.8,
'Havana': 25.2,
'Dubai': 26.9,
'Sofia': 10.6,
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
