Содержание

Интерактивный учебник языка Python

1. Словари

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

Структура данных, позволяющая идентифицировать ее элементы не по числовому индексу, а по произвольному, называется словарем или ассоциативным массивом. Соответствующая структура данных в языке Питон называется dict.

Рассмотрим простой пример использования словаря. Заведем словарь 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)

Итак, каждый элемент словаря состоит из двух объектов:

ключа и значения. В нашем примере ключом является название страны, значением является название столицы. Ключ идентифицирует элемент словаря, значение является данными, которые соответствуют данному ключу. Значения ключей — уникальны, двух одинаковых ключей в словаре быть не может.

В жизни широко распространены словари, например, привычные бумажные словари (толковые, орфографические, лингвистические). В них ключом является слово-заголовок статьи, а значением — сама статья. Для того, чтобы получить доступ к статье, необходимо указать слово-ключ.

Другой пример словаря, как структуры данных — телефонный справочник. В нем ключом является имя, а значением — номер телефона. И словарь, и телефонный справочник хранятся так, что легко найти элемент словаря по известному ключу (например, если записи хранятся в алфавитном порядке ключей, то легко можно найти известный ключ, например, бинарным поиском), но если ключ неизвествен, а известно лишь значение, то поиск элемента с данным значением может потребовать последовательного просмотра всех элементов словаря.

Особенностью ассоциативного массива является его динамичность: в него можно добавлять новые элементы с произвольными ключами и удалять уже существующие элементы. При этом размер используемой памяти пропорционален размеру ассоциативного массива. Доступ к элементам ассоциативного массива выполняется хоть и медленнее, чем к обычным массивам, но в целом довольно быстро.

В языке Питон ключом может быть произвольный неизменяемый тип данных: целые и действительные числа, строки, кортежи. Ключом в словаре не может быть множество, но может быть элемент типа frozenset: специальный тип данных, являющийся аналогом типа set, который нельзя изменять после создания. Значением элемента словаря может быть любой тип данных, в том числе и изменяемый.

Когда нужно использовать словари

Словари нужно использовать в следующих случаях:

  • Подсчет числа каких-то объектов. В этом случае нужно завести словарь, в котором ключами являются объекты, а значениями — их количество.
  • Хранение каких-либо данных, связанных с объектом. Ключи — объекты, значения — связанные с ними данные. Например, если нужно по названию месяца определить его порядковый номер, то это можно сделать при помощи словаря Num['January'] = 1; Num['February'] = 2; ....
  • Установка соответствия между объектами (например, “родитель—потомок”). Ключ — объект, значение — соответствующий ему объект.
  • Если нужен обычный массив, но масимальное значение индекса элемента очень велико, и при этом будут использоваться не все возможные индексы (так называемый “разреженный массив”), то можно использовать ассоциативный массив для экономии памяти.

Создание словаря

Пустой словарь можно создать при помощи функции dict() или пустой пары фигурных скобок {} (вот почему фигурные скобки нельзя использовать для создания пустого множества). Для создания словаря с некоторым набором начальных значений можно использовать следующие конструкции:

Capitals = {'Russia': 'Moscow', 'Ukraine': 'Kiev', 'USA': 'Washington'}
Capitals = dict(Russia = 'Moscow', Ukraine = 'Kiev', USA = 'Washington')
Capitals = dict([("Russia", "Moscow"), ("Ukraine", "Kiev"), ("USA", "Washington")])
Capitals = dict(zip(["Russia", "Ukraine", "USA"], ["Moscow", "Kiev", "Washington"]))
print(Capitals)

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

dict нужно передать список, каждый элемент которого является кортежем из двух элементов: ключа и значения. В четвертом способе используется функция zip, которой передаются два списка одинаковой длины: список ключей и список значений.

Работа с элементами словаря

Основная операция: получение значения элемента по ключу, записывается так же, как и для списков: A[key]. Если элемента с заданным ключом нет в словаре, то возникает исключение

KeyError.

Другой способ определения значения по ключу — метод get: A.get(key). Если элемента с ключом get нет в словаре, то возвращается значение None. В форме записи с двумя аргументами A.get(key, val) метод возвращает значение val, если элемент с ключом key отсутствует в словаре.

Проверить принадлежность элемента словарю можно операциями in и not in, как и для множеств.

Для добавления нового элемента в словарь нужно просто присвоить ему какое-то значение:

A[key] = value.

Для удаления элемента из словаря можно использовать операцию del A[key] (операция возбуждает исключение KeyError, если такого ключа в словаре нет. Вот два безопасных способа удаления элемента из словаря.

A = {'ab' : 'ba', 'aa' : 'aa', 'bb' : 'bb', 'ba' : 'ab'}
key = 'ac'
if key in A:
    del A[key]
try:
    del A[key]
except KeyError:
	print('There is no element with key "' + key + '" in dict')
print(A)

В первом случае мы предварительно проверяем наличие элемента, а во втором — перехватываем и обрабатываем исключение.

Еще один способ удалить элемент из словаря: использование метода pop: A.pop(key). Этот метод возвращает значение удаляемого элемента, если элемент с данным ключом отсутствует в словаре, то возбуждается исключение. Если методу pop передать второй параметр, то если элемент в словаре отсутствует, то метод pop возвратит значение этого параметра. Это позволяет проще всего организовать безопасное удаление элемента из словаря: A.pop(key, None).

Перебор элементов словаря

Можно легко организовать перебор ключей всех элементов в словаре:

A = dict(zip('abcdef', list(range(6))))
for key in A:
    print(key, A[key])

Следующие методы возвращают

представления элементов словаря. Представления во многом похожи на множества, но они изменяются, если менять значения элементов словаря. Метод keys возвращает представление ключей всех элементов, метод values возвращает представление всех значений, а метод items возвращает представление всех пар (кортежей) из ключей и значений.

Соответственно, быстро проверить, есть ли значение val среди всех значений элементов словаря A можно так: val in A.values(), а организовать цикл так, чтобы в переменной

key был ключ элемента, а в переменной val, было его значение можно так:

A = dict(zip('abcdef', list(range(6))))
for key, val in A.items():
    print(key, val)

Ссылки на задачи доступны в меню слева. Эталонные решения теперь доступны на странице самой задачи.

создание словаря Python, добавление элементов, удаление, поиск и другие операции, функции и методы

Словарь — это структура данных, которая позволяет записывать и получать различные значения по ключу. В некоторых языках ключами и значениями словаря могут быть только специфические объекты. А в Python — любые сущности: вплоть до пользовательских классов.

Как работать со словарями в Python

🚀 Создать

Ключевое слово dict

В Python есть множество встроенных функций. В том числе, чтобы получить стандартные структуры данных или преобразовать объекты к этим структурам. Если нужно создать пустой словарь, напишите:

my_new_dict = dict()

Синтаксическая конструкция

Еще, чтобы получить объект словаря, можно использовать синтаксис языка:

another_dict  = {"string_key": "the value", 2: "another value"}

Выражение-генератор

Третий способ: применить выражение — генератор словаря. Это помогает составить словарь из пары итерируемых объектов, то есть объектов, которые можно повторять. Например:

list_one = ["one", "two", "three", "four", "five"]
list_two = [1, 2, 3, 4, 5]
the_dict = {}

for k, v in zip(list_one, list_two):
    the_dict[k] = v + 1

print(the_dict["one"])
2

print(the_dict["two"])
3

print(the_dict.keys())
dict_keys(['one', 'two', 'three', 'four', 'five'])

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

list_one = ["one", "two", "three", "four", "five"]
list_two = [1, 2, 3, 4, 5]

the_dict = dict(zip(list_one, list_two))

🚀 Получить значения

Для этого нужно обратиться к объекту словаря и указать нужный ключ:

the_dict = {0: "A", 1: "B", 2: "C", 3: "D", 4: "E"}

let_a = the_dict[0]
let_b = the_dict[1]

print(f"{let_a}{let_b} -- {the_dict[2]}{the_dict[3]}")
AB -- CD

🚀 Добавить, изменить и удалить элементы

Нужно обратиться по ключу к объекту словаря, выполнить операцию присваивания:

# добавление элементов
the_dict = {}
the_dict["my_key"] = "some value"
the_dict["my_another_key"] = 42

# изменение элементов
the_dict["my_key"] = "yet another value"

# удаление элементов
del the_dict["my_key"]

🚀 Проверить наличие ключа

Чтобы проверить, есть ли указанный ключ в словаре, используйте ключевое слово in или метод get словаря:

the_dict = {"a": 1, "b": 2}

print("c" in the_dict)
False

print("a" in the_dict)
True

Метод get объекта словаря возвращает найденное значение в словаре по ключу. Или значение, указанное как стандартное возвращаемое, — если ключ не найден:

the_dict = {"a": 1, "b": 2}

if not the_dict.get("A", None):
    print("Такой ключ не найден")
Такой ключ не найден

a = the_dict.get("a", None)
print(a)
1

🚀 Скопировать словарь

Чтобы получить неглубокую копию, вызовите метод copy или примените метод модуля copy: copy.copy. Если нужна глубокая, нужен метод copy.deepcopy.

import copy

the_dict = {1: "a", 2:"b"}

dict_copy = the_dict.copy()
dict_copy2 = copy.copy(the_dict) # то же самое, что и в примере выше

deep_copy = copy.deepcopy(the_dict) # полная, глубокая копия

🚀 Определить длину словаря

Узнайте, сколько ключей содержит словарь, с помощью встроенной функции len. Она возвращает количество итерируемых объектов.

the_dict = {"a": 1, "b": 2}
length = len(the_dict)
print(length)
2

Итерация словаря

https://sky.pro/media/obzor-biblioteki-pandas/

Ключи, значения или всё вместе получают с помощью трех методов словаря. Для ключей — keys, для значений — values, для ключей и значений — items. Вызывать метод keys необязательно, так как при попытке итерации по словарю по умолчанию будут использоваться его ключи. По всем полученным данным можно произвести итерацию — повторить какое-либо действие.

✔️ По ключам

the_dict = {"a": 1, "b": 2}

for k in the_dict.keys():
    print(k)
    print(the_dict[k])
a
1
b
2

Keys используется по умолчанию, чтобы получить объект итератора:

the_dict = {"a": 1, "b": 2}

for k in the_dict: # вызова keys не происходит
    print(k)
    print(the_dict[k])
a
1
b
2

✔️ По значениям

the_dict = {"a": 1, "b": 2}

for v in the_dict. values():
    print(v)
1
2

✔️ По ключам и значениям

Пример распаковки кортежа вида «ключ, значение», чтобы сохранить их в отдельные переменные:

the_dict = {"a": 1, "b": 2}

for k, v in the_dict.items():
    print(f"{k} - {v}")
a - 1
b - 2

Другие методы

✔️ fromkeys

Этот метод позволяет создавать словари с ключами, полученными из итерируемого объекта. В качестве значения по умолчанию используется второй аргумент функции:

the_list = ["a", "b"]
the_dict = dict.fromkeys(the_list, False)

for v in the_dict.values():
    print(v)
False
False

for k in the_dict:
    print(k)
a
b

✔️ setdefault

Метод помогает указать стандартное значение ключа. При этом не изменять его, если оно уже есть по переданному ключу:

the_dict = {"a": 1, "b": 2}
the_dict. setdefault("a", True)

print(the_dict.keys())
dict_keys(['a', 'b'])

print(the_dict.get("a", None))
1

Вложенные словари

Словари могут содержать другие словари: в Python их называют вложенными. Они полезны при сериализации и десериализации. Их создают так:

the_dict = {"shape": "round", "size": 2}
nested_dict = {"first_color": "blue", "second_color": "red"}

the_dict["color"] = nested_dict

print(the_dict)
{'shape': 'round', 'size': 2, 'color': {'first_color': 'blue', 'second_color': 'red'}}

Альтернативные типы данных

В старых версиях Python ключи словаря не были упорядочены. Чтобы решить эту проблему, использовали модуль collections, а именно объект OrderedDict. Этот модуль тоже содержит и другие варианты словаря.

✔️ OrderedDict

Вместо типичной реализации по типу хеш-таблицы эта использует список кортежей, чтобы сохранять порядок ключей. В новых версиях языка в этом объекте уже нет смысла:

import collections

the_dict = collections.OrderedDict({"a": 1, "b": 2, 3: "c"})
print(the_dict)
OrderedDict([('a', 1), ('b', 2), (3, 'c')])

the_dict["d"] = "value"
print(the_dict)
OrderedDict([('a', 1), ('b', 2), (3, 'c'), ('d', 'value')])

✔️ Defaultdict

Объект класса defaultdict позволяет избежать ошибки KeyError при обращении к несуществующему ключу. Он возвращает стандартное значение, вычисляемое указанной функцией:

from collections import defaultdict

def get_value():
    return "Ключ не указан"

the_dict = defaultdict(get_value)
the_dict["a"] = 1
the_dict["b"] = 2

print(the_dict["a"])
1
print(the_dict["b"])
2
print(the_dict["c"])
Ключ не указан

✔️ Counter

Объект класса Counter полезен, когда нужно получить количество повторов объектов итерируемой сущности:

from collections import Counter

the_string = "AABCBBCAACBCABBABABBACCACBCBBBCA"
the_counter = Counter(the_string)
print(the_counter)
Counter({'B': 13, 'A': 10, 'C': 9})

Вебинары

Главное о работе со словарями в Python

  • Словари представляют структуру данных типа «ключ-значение». Их создают с помощью ключевого слова dict, синтаксической конструкции и выражения-генератора.
  • Метод copy позволяет скопировать словарь, метод get — проверить наличие ключа, функция len — определить длину словаря в Python.
  • В качестве ключа и значения можно использовать любую структуру данных.
  • Ключи, значения или всё вместе получают с помощью трех методов словаря: keys, values, items.

Изучайте Python на онлайн-курсе от Skypro «Python-разработчик». Программа под силу даже тем, у кого нет опыта в IT. Преподаватели — практикующие разработчики с опытом найма и наставничества.

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

Словари Python

❮ Предыдущая Далее ❯


thisdict = {
  «марка»: «Ford»,
  «model»: «Mustang»,
  «year»: 1964
}


Dictionary values ​​

Словари используются для хранения данных в ключе: пары значений.

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

Начиная с Python версии 3.7, словари упорядочены по . В Python 3.6 и более ранних словарях неупорядоченный .

Словари записываются в фигурных скобках и имеют ключи и значения:

Пример

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

thisdict = {
  «бренд»: «Ford»,
  «model»: «Mustang»,
«year»: 1964
}
print(thisdict)

Попробуйте сами »


Элементы словаря

Элементы словаря упорядочены, изменяемы и не допускают дублирования.

Элементы словаря представлены парами ключ:значение, и на них можно ссылаться используя имя ключа.

Пример

Вывести значение «бренд» из словаря:

thisdict = {
  «бренд»: «Ford»,
  «модель»: «Mustang»,
  «год»: 1964
}
print(thisdict [«бренд»])

Попробуйте сами »


Заказали или нет?

Начиная с Python версии 3. 7, словари упорядочены по . В Python 3.6 и более ранних версиях словари неупорядочены .

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

Неупорядоченный означает, что элементы не имеют определенный порядок, вы не можете ссылаться на элемент с помощью индекса.


Изменяемый

Словари изменяемы, что означает, что мы можем изменять, добавлять или удалять элементы после словарь создан.


Дубликаты не допускаются

В словарях не может быть двух элементов с одним и тем же ключом:

Пример

Повторяющиеся значения перезаписывают существующие значения:

thisdict = {
  «brand»: «Ford»,
  «model»: «Mustang»,
  «year»: 1964,
  «year»: 2020
}
print(thisdict)

Try it Yourself »


Длина словаря 90

Чтобы определить количество элементов в словаре, используйте len() функция:

Пример

Вывести количество элементов в словаре:

print(len(thisdict))

Попробуйте сами »


Элементы словаря — типы данных

Значения в элементах словаря могут относиться к любому типу данных:

Пример

Типы данных String, int, boolean и list:

thisdict = {
 «brand»: «Ford»,
 «electric»: False,
  «год»: 1964,
  «цвета»: [«красный», «белый», «синий»]
}

Попробуйте сами »


type()

С точки зрения Python, словари определяются как объекты с типом данных ‘dict’:

Пример

Вывести тип данных словаря:

thisdict = {
  «марка»: «Ford»,
  «model»: «Mustang»,
  «year»: 1964
}
print(type(thisdict))

Попробуйте сами »


Конструктор dict()

Также можно использовать конструктор dict() для создания словаря.

Пример

Использование метода dict() для создания словаря:

thisdict = dict(имя = «Джон», возраст = 36, страна = «Норвегия»)
print(thisdict)

Попробуйте сами »


Коллекции (массивы) Python

В языке программирования Python существует четыре типа данных коллекций:

  • Список — это упорядоченная и изменяемая коллекция. Позволяет дублировать участников.
  • Кортеж представляет собой упорядоченный и неизменяемый набор. Позволяет дублировать участников.
  • Набор представляет собой неупорядоченную коллекцию, неизменяемый* и неиндексируемый. Нет повторяющихся членов.
  • Словарь – это коллекция, которая заказывается** и может быть изменена. Нет повторяющихся членов.

*Set элементы неизменны, но вы можете удалять и/или добавлять элементы всякий раз, когда вам нравится.

**Начиная с Python версии 3.7, словари упорядочены по . В Python 3.6 и более ранних версиях словари неупорядочены .

При выборе типа коллекции полезно понимать свойства этого типа. Выбор правильного типа для определенного набора данных может означать сохранение смысла, а также повышение эффективности или безопасности.


❮ Предыдущий Далее ❯


Словари на Python – Real Python