Словари (dict)
в языке Python
Понятие
Их иногда ещё называют ассоциативными массивами или хеш-таблицами.
Словари в питоне хранят данные в виде пары ключ-значение. Ключи в обычном словаре хранятся без гарантии порядка. То есть в отличие от списка элементы словаря имеют не числовой индекс, а произвольный.
Создание пустого словаря:
№1 slovar = { } №2 slovar = dict() №3 (метода fromkeys) persona = dict.fromkeys([ ]) |
Инициализация элементов словаря:
№1:
students = { 'Иван': ['2', '5', '4'], 'Петр': ['4', '4'] }
print(students) � # {'Петр': ['4', '4'], 'Иван': ['2', '5', '4']}
�№2:
persona = {'name':'Ivan','email':'palit@mail.com'}
print(persona)
# {'name': 'Ivan', 'email': 'pal@mail.com'}
Значения ключей должны быть уникальными, то есть двух одинаковых ключей в словаре быть не может.
Инициализация элементов словаря:
№3:
persona = dict(name = 'Ivan',tel = '896256767')
print(persona)
# {'name': 'Ivan', 'email': '896256767'}
№4:
d = dict.fromkeys(['a', 'b'])
print(d)
# {'a': None, 'b': None}
№5:
d = dict.fromkeys(['a', 'b'], 100)
print(d) # {'a': 100, 'b': 100}
Инициализация элементов словаря:
№6 с помощью генераторов словарей:
d = {a: a ** 2 for a in range(7)}
print(d)
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36}
Добавление записей в словарь,� извлечь значения ключей
d = {1: 2, 2: 4, 3: 9}
print(d[1])
d[4] = 4 ** 2
print(d)
# 2
# {1: 2, 2: 4, 3: 9, 4: 16}
Добавление записей в словарь,� извлечь значения ключей
d = {1: 2, 2: 4, 3: 9}
d[4] = 4 ** 2
d[7] = 2 ** 2
d[10] = 5 ** 2
print(d)
print(d[4])
# {1: 2, 2: 4, 3: 9, 4: 16, 7: 4, 10: 25}
16
Изменение записей в словарь
d = {1: 2, 2: 4, 3: 9}
d[1] = 3
d[2] = 2
print(d)
# {1: 3, 2: 2, 3: 9}
Объединение словарей. Метод update()
dic1 = {1: 10, 2: 20}
dic2 = {3: 30, 4: 40}
dic1.update(dic2)
print(dic1)
print(dic2)
# {1: 10, 2: 20, 3: 30, 4: 40}
{3: 30, 4: 40}
dic1 = {1: 10, 2: 20}
dic2 = {3: 30, 4: 40}
dic3 = {**dic1, **dic2}
print(dic3)
# {1: 10, 2: 20, 3: 30, 4: 40}
Обновление данных словаря. Дополнение.
my_dict = {'1': 'yellow'}
my_dict.update({'2': 'green'}) # Дополняем
my_dict.update({'2': 'blue'}) # Обновляем
print(my_dict)
РАБОТА С ЭЛЕМЕНТАМИ СЛОВАРЯ
методы словарей
Перебор элементов
A = {'red' : 'красный', 'green' : 'зеленый', 'blue' : 'синий'}
for key in A:
print(key, A[key])
red красный
green зеленый
blue синий
Удаление элемента
A = {'red' : 'красный', 'green' : 'зеленый', 'blue' : 'синий'}
key='yellow'
if key in A:
del(A[key])
print(A)
{'red': 'красный', 'green': 'зеленый', 'blue': 'синий'}
Удаление элемента. Метод pop()
В результате мы увидим:
red красный
green зеленый
blue синий
Или так:
A = {'red' : 'красный', 'green' : 'зеленый', 'blue' : 'синий'}
key='yellow'
if key in A:
A.pop(key)
print(A)
{'red': 'красный', 'green': 'зеленый', 'blue': 'синий'}
Выбор значения по ключу. Метод get()
users = {"+11111111": "Tom","+33333333": "Bob","+55555555": "Alice"}
user1 = users.get("+55555555")
print(user1) # Alice
user2 = users.get("+33333333", "Unknown user")
print(user2) # Bob
user3 = users.get("+44444444", "Unknown user")
print(user3) # Unknown user
Метод items()
A = {'red' : 'красный', 'green' : 'зеленый', 'blue' : 'синий'}
for key, val in A.items():
print(key, val)
Метод items() возвращает набор кортежей. Каждый кортеж содержит ключ и значение элемента, которые при переборе мы тут же можем получить в переменные key и value.
dict.items() - возвращает пары (ключ, значение).
red красный
green зеленый
blue синий
Метод keys()
Метод dict.keys() - возвращает ключи в словаре.
users = {"+11111111": "Tom","+33333333": "Bob","+55555555": "Alice"}
for key in users.keys():
print(key)
+11111111
+33333333
+55555555
Метод clear()
очищает словарь (удаляет словарь)
users.clear()
Метод copy()
# {"+1111111": "Tom", "+3333333": "Bob", "+5555555": "Alice"}
users = {"+1111111": "Tom", "+3333333": "Bob", "+5555555": "Alice"}
students = users.copy()
print(students)
Преобразование списков и кортежей в словарь
s = [["+111123455", "Tom"],["+384767557", "Bob"],["+958758767", "Alice"]]
d = dict(s)
print(d)
{'+111123455': 'Tom', '+384767557': 'Bob', '+958758767': 'Alice'}
t = (("+111123455", "Tom"),("+384767557", "Bob"),("+958758767", "Alice"))
d = dict(t)
print(d)
{'+111123455': 'Tom', '+384767557': 'Bob', '+958758767': 'Alice'}
Сравнение словарей
Метод cmp(a,b), где a,b - два словаря для сравнения
a = {1: "one", 2: "two", 3: "three"}
b = {4: "four", 5: "five"}
c = {1: "one", 2: "two", 3: "three"}
print(cmp(a, b))
print(cmp(b, c))
print(cmp(a, c))
1
-1
0
Закрепление
№1. Что выведет данная программа?
dicts = {}
keys = range(4)
values = ["Hi", "I", "am", "John"]
for i in keys:
for x in values:
dicts[i] = x
print(dicts)
{0: 'John', 1: 'John', 2: 'John', 3: 'John'}
№2. Что выведет данная программа?
dicts = {}
keys = range(4)
values = ["Hi", "I", "am", "John"]
for i in keys:
dicts[i] = values[i]
print(dicts)
{0: 'Hi', 1: 'I', 2: 'am', 3: 'John'}
№3. Что выведет данная программа?
dicts = {}
keys = range(4)
values = ["Hi", "I", "am", "John"]
print(dict(zip(keys, values)))
{0: 'Hi', 1: 'I', 2: 'am', 3: 'John'}
Разбор задания
Дан словарь, удалите из него все элементы со значениями None.
Было:
a = {'a': None, 'b': 1, 'c': 2, 'd': None, 'e': 3}
Стало:
{'b': 1, 'c': 2, 'e': 3}
a = {'a': None, 'b': 1, 'c': 2, 'd': None, 'e': 3}
for j in a.copy():
if a[j] == None:
a.pop(j)
print(a)
a = {'a': None, 'b': 1, 'c': 2, 'd': None, 'e': 3}
b = {}
for k, v in a.items():
if v != None:
b.update({k: v})
print(b)
Практическая работа
Практическая работа. Разбор с учителем.
1. Создать произвольный словарь dct.
2. Добавить новый элемент с ключом ‘str_key’ типа str и значением ‘12345’ типа int
3. Добавить новый элемент с ключом типа кортеж(tuple) и значением типа список(list)
4. Получить элемент по ключу
5. Удалить элемент по ключу
6. Получить список ключей словаря
# 1. Создаем словарь
dct = {1: 'value_1', 2: 'value_2', 3: 'value_3'}
# 2. Добавляем в словарь новый элемент с ключом 'str_key' и значением 12345
dct['str_key'] = 12345
# Содержимое словаря: {1: 'value_1', 2: 'value_2', 3: 'value_3', 'str_key': 12345}
# 3. Добавляем в словарь новый элемент с ключом ('it', 'is', 'tuple') и значением [11, 22, 'list_value', 33, {1, 2, 3}]
dct[('it', 'is', 'tuple')] = [11, 22, 'list_value', 33, {1, 2, 3}]
# Содержимое словаря: {1: 'value_1', 2: 'value_2', 3: 'value_3', 'str_key': 12345, ('it', 'is', 'tuple'): [11, 22, 'list_value', 33, {1, 2, 3}]}
# 4. Получаем элемент словаря по ключу 'str_key'
# Способ 1: Напрямую - в случае отсутствия ключа формируется исключение
item_by_key_v1 = dct['str_key']
# Значение item_by_key_v1 равно 12345
# Способ 2: Через функцию get() - в случае отсутствия ключа возвращается дефолтное значение 'No item'
item_by_key_v2 = dct.get('str_key', 'No item')
# Значение item_by_key_v2 так же равно 12345
# 5. Удаляем элемент с ключом '2' из словаря
item_deleted = dct.pop(2, 'No item')
# Содержимое словаря: {1: 'value_1', 3: 'value_3', 'str_key': 12345, ('it', 'is', 'tuple'): [11, 22, 'list_value', 33, {1, 2, 3}]}
Задача №1. Создадим словарь Capitals, где индексом является название страны, а значением — название столицы этой страны. Это позволит легко определять по строке с названием страны ее столицу.
# Создадим пустой словать Capitals
Capitals = dict()
# Заполним его несколькими значениями
Capitals['Russia'] = 'Moscow'
Capitals['Ukraine'] = 'Kiev'
Capitals['USA'] = 'Washington'
Countries = ['Russia', 'France', 'USA', 'Russia']
for country in Countries:
# Для каждой страны из списка проверим, есть ли она в словаре Capitals
if country in Capitals:
print('Столица страны ' + country + ': ' + Capitals[country])
else:
print('В базе нет страны c названием ' + country)
Задача №2
def to_dict(lst):
return {element: element for element in lst}
# Тесты
print(to_dict([1, 2, 3, 4]))
print(to_dict(['grey', (2, 17), 3.11, -4]))
Задание №3
С помощью интернета создай словарь "страна - население" (как минимум 4 страны)
Программа спрашивает у пользователя какую страну добавить, какое у страны население и добавляет значения в словарь, затем выводит список населений стран, отсортированный по убыванию.
Решение задания №2
С помощью интернета создай словарь "страна - население" (как минимум 4 страны)
Программа спрашивает у пользователя какую страну добавить, какое у страны население и добавляет значения в словарь, затем выводит список населений стран, отсортированный по убыванию.
dirs = {} # создание словаря
# ввод значений в словарь
i = 1
while True:
страна = input(f'Введите название {i}-й страны: ')
население = input('Введите её население: ')
dirs.update({страна : население})
q = input('Введите q что бы завершить ввод (или Enter что бы продолжить): ')
if q == 'q': break
i += 1
# вывод словаря
print(dirs)
Самостоятельно №1:
Напишите функцию F, которая принимает аргумент в виде списка целых чисел и возвращает словарь d, в котором каждый элемент списка является ключом словаря, а значение ключа на единицу больше.
Решение №1
def f(s):
return {a: a+1 for a in s}
# Тесты
print(f([1, 2, 3, 4]))
Самостоятельно №2
Создайте словарь school и наполните данными, которые бы отражали количество учащихся в разных классах (1а, 1б, 2б, 6а, 7в и т. п.).
Внесите изменения в словарь согласно следующему:
а) в одном из классов изменилось количество учащихся,
б) в школе появился новый класс,
с) в школе был расформирован (удален) другой класс.
д) вычислите общее количество учащихся в школе.
Самостоятельно №3
Напишите функцию, которая принимает один словарь, и возвращает другой, в котором ключами являются значения из первого словаря, а значениями – соответствующие им ключи.
Создайте словарь, передайте его в функцию. Выведите на экран исходный и "перевернутый" словари.
Дополнительное задание
*
Задание 1:�
Задан словарь перевода цветов с английского языка на русский (пары англ: русск). Словарь не вводить, а инициализировать значениями в программе.
Все слова в словаре различны.
Желаемый результат:
Задание 2:�
В первой строке содержится число N — число элементов в словаре. Дан список (словарь) стран и рек, протекающих в каждой стране. Затем даны названия рек (в виде списка). Выполните задания:�1) Для каждой реки укажите, в какой стране она протекает.�2) Проверьте, есть ли введенное название реки в словаре (вывести есть или нет)�3) Добавьте новую пару страна-река в словарь.�4) Удалите из словаря реку (название реки запросить).
ЕГЭ №12
работа со строками
Задача №1
def count_it(sequence):
num_frequency = {int(item): sequence.count(item) for item in sequence}
sorted_num_frequency = sorted(num_frequency.items(), key=lambda element: element[1])
return dict(sorted_num_frequency[-3:])
# Тесты
from random import*
a='1'*randint(1,10)+'2'*randint(1,10)+ '3'*randint(1,10)+ '3'*randint(1,10)+ '4'*randint(1,10)+ '5'*randint(1,10)
print(a)
print(count_it(a) )
Пример работы со словарем:
Домашняя работа
https://pythontutor.ru/lessons/dicts/
https://younglinux.info/python/dictionary
Дорешать задачи из последней ссылки