1 of 47

в языке Python

2 of 47

Понятие

  • Словари в Python - неупорядоченные коллекции произвольных объектов с доступом по ключу.

Их иногда ещё называют ассоциативными массивами или хеш-таблицами.

Словари в питоне хранят данные в виде пары ключ-значение. Ключи в обычном словаре хранятся без гарантии порядка. То есть в отличие от списка элементы словаря имеют не числовой индекс, а произвольный.

3 of 47

Создание пустого словаря:

№1

slovar = { }

№2

slovar = dict()

№3 (метода fromkeys)

persona = dict.fromkeys([ ])

4 of 47

Инициализация элементов словаря:

№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'}

Значения ключей должны быть уникальными, то есть двух одинаковых ключей в словаре быть не может.

5 of 47

Инициализация элементов словаря:

№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 of 47

Инициализация элементов словаря:

№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}

7 of 47

Добавление записей в словарь,� извлечь значения ключей

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}

8 of 47

Добавление записей в словарь,� извлечь значения ключей

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

9 of 47

Изменение записей в словарь

d = {1: 2, 2: 4, 3: 9}

d[1] = 3

d[2] = 2

print(d)

# {1: 3, 2: 2, 3: 9}

10 of 47

Объединение словарей. Метод 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}

11 of 47

Обновление данных словаря. Дополнение.

my_dict = {'1': 'yellow'}

my_dict.update({'2': 'green'}) # Дополняем

my_dict.update({'2': 'blue'}) # Обновляем

print(my_dict)

12 of 47

РАБОТА С ЭЛЕМЕНТАМИ СЛОВАРЯ

методы словарей

13 of 47

Перебор элементов

A = {'red' : 'красный', 'green' : 'зеленый', 'blue' : 'синий'}

for key in A:

print(key, A[key])

red красный

green зеленый

blue синий

14 of 47

Удаление элемента

  • Для удаления элемента используется процедура del(A[key]). Если удаляемый ключ отсутствует в словаре, то будет возвращено исключение. Для того, чтобы избежать исключения, применяется безопасное удаление с использованием оператора try...except:

A = {'red' : 'красный', 'green' : 'зеленый', 'blue' : 'синий'}

key='yellow'

if key in A:

del(A[key])

print(A)

{'red': 'красный', 'green': 'зеленый', 'blue': 'синий'}

15 of 47

Удаление элемента. Метод pop()

В результате мы увидим:

red красный

green зеленый

blue синий

Или так:

A = {'red' : 'красный', 'green' : 'зеленый', 'blue' : 'синий'}

key='yellow'

if key in A:

A.pop(key)

print(A)

{'red': 'красный', 'green': 'зеленый', 'blue': 'синий'}

  • pop(key): удаляет элемент по ключу key и возвращает удаленный элемент. Если элемент с данным ключом отсутствует, то генерируется исключение KeyError
  • pop(key, default): удаляет элемент по ключу key и возвращает удаленный элемент. Если элемент с данным ключом отсутствует, то возвращается значение default

16 of 47

Выбор значения по ключу. Метод get()

  • get(key): возвращает из словаря элемент с ключом key. Если элемента с таким ключом нет, то возвращает значение None
  • get(key, default): возвращает из словаря элемент с ключом key. Если элемента с таким ключом нет, то возвращает значение по умолчанию default

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

17 of 47

Метод items()

A = {'red' : 'красный', 'green' : 'зеленый', 'blue' : 'синий'}

for key, val in A.items():

print(key, val)

Метод items() возвращает набор кортежей. Каждый кортеж содержит ключ и значение элемента, которые при переборе мы тут же можем получить в переменные key и value.

dict.items() - возвращает пары (ключ, значение).

red красный

green зеленый

blue синий

18 of 47

Метод keys()

Метод dict.keys() - возвращает ключи в словаре.

users = {"+11111111": "Tom","+33333333": "Bob","+55555555": "Alice"}

for key in users.keys():

print(key)

+11111111

+33333333

+55555555

19 of 47

Метод clear()

очищает словарь (удаляет словарь)

users.clear()

20 of 47

Метод copy()

# {"+1111111": "Tom", "+3333333": "Bob", "+5555555": "Alice"}

users = {"+1111111": "Tom", "+3333333": "Bob", "+5555555": "Alice"}

students = users.copy()

print(students)

21 of 47

Преобразование списков и кортежей в словарь

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'}

22 of 47

Сравнение словарей

Метод 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

23 of 47

Закрепление

24 of 47

№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'}

25 of 47

№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'}

26 of 47

№3. Что выведет данная программа?

dicts = {}

keys = range(4)

values = ["Hi", "I", "am", "John"]

print(dict(zip(keys, values)))

{0: 'Hi', 1: 'I', 2: 'am', 3: 'John'}

27 of 47

Разбор задания

Дан словарь, удалите из него все элементы со значениями 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)

28 of 47

Практическая работа

29 of 47

Практическая работа. Разбор с учителем.

1. Создать произвольный словарь dct.

2. Добавить новый элемент с ключом ‘str_key’ типа str и значением ‘12345’ типа int

3. Добавить новый элемент с ключом типа кортеж(tuple) и значением типа список(list)

4. Получить элемент по ключу

5. Удалить элемент по ключу

6. Получить список ключей словаря

30 of 47

# 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}]}

31 of 47

Задача №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)

32 of 47

Задача №2

33 of 47

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]))

34 of 47

Задание №3

С помощью интернета создай словарь "страна - население" (как минимум 4 страны)

Программа спрашивает у пользователя какую страну добавить, какое у страны население и добавляет значения в словарь, затем выводит список населений стран, отсортированный по убыванию.

35 of 47

Решение задания №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)

36 of 47

Самостоятельно №1:

Напишите функцию F, которая принимает аргумент в виде списка целых чисел и возвращает словарь d, в котором каждый элемент списка является ключом словаря, а значение ключа на единицу больше.

37 of 47

Решение №1

def f(s):

return {a: a+1 for a in s}

# Тесты

print(f([1, 2, 3, 4]))

38 of 47

Самостоятельно №2

Создайте словарь school и наполните данными, которые бы отражали количество учащихся в разных классах (1а, 1б, 2б, 6а, 7в и т. п.).

Внесите изменения в словарь согласно следующему:

а) в одном из классов изменилось количество учащихся,

б) в школе появился новый класс,

с) в школе был расформирован (удален) другой класс.

д) вычислите общее количество учащихся в школе.

39 of 47

Самостоятельно №3

Напишите функцию, которая принимает один словарь, и возвращает другой, в котором ключами являются значения из первого словаря, а значениями – соответствующие им ключи.

Создайте словарь, передайте его в функцию. Выведите на экран исходный и "перевернутый" словари.

40 of 47

Дополнительное задание

*

41 of 47

Задание 1:

Задан словарь перевода цветов с английского языка на русский (пары англ: русск). Словарь не вводить, а инициализировать значениями в программе.

Все слова в словаре различны.

  1. Выведите весь словарь.
  2. Выведите перевод последнего слова в словаре.
  3. Удалите из словаря слово red.

Желаемый результат:

42 of 47

Задание 2:

В первой строке содержится число N — число элементов в словаре. Дан список (словарь) стран и рек, протекающих в каждой стране. Затем даны названия рек (в виде списка). Выполните задания:�1) Для каждой реки укажите, в какой стране она протекает.�2) Проверьте, есть ли введенное название реки в словаре (вывести есть или нет)�3) Добавьте новую пару страна-река в словарь.�4) Удалите из словаря реку (название реки запросить).

43 of 47

ЕГЭ №12

работа со строками

44 of 47

Задача №1

45 of 47

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) )

46 of 47

Пример работы со словарем:

47 of 47

Домашняя работа

https://pythontutor.ru/lessons/dicts/

https://younglinux.info/python/dictionary

Дорешать задачи из последней ссылки