Ввод данных словаря с клавиатуры
Подскажите, пожалуйста, как задать словарь с клавиатуры(через input)?
к примеру в моем словаре должны храниться даты и события. могу ли я использовать этот код? То есть я ввожу год и соответствующее событие в истории.
только какой-нибудь механизм выхода из цикла прикрутить стоит
![]()
я плохо знаю питон, если ошиблась, простите *^_^*
![]()
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Словари в Python
В этом руководстве вы узнаете всё о словарях в Python: как их создавать, как добавлять, удалять, как получать из них элементы, а еще познакомитесь со встроенными методами словарей.
Словарь — это неупорядоченный набор элементов. Элемент словаря представляет собой пару ключ: значение . Словари оптимизированы для получения значений по заданному ключу.
Как создать словарь
Чтобы создать словарь в Python, необходимо прописать элементы внутри фигурных скобок <> и разделить их запятыми.
В элементе содержится ключ и соответствующее значение, они записываются так: (ключ: значение) .
В словарях значения могут повторяться и быть любого типа. Ключи же повторяться не могут и должны быть неизменяемым типом (строками, числовыми типами и кортежами с неизменяемыми элементами).
Как вы увидели выше, мы можем создать словарь с помощью встроенной функции dict() .
Как получить элементы из словаря
В отличие от других типов данных, где для доступа к элементам используется индексация, в словаре используются ключи. Они используются внутри квадратных скобок или в качестве аргумента метода get() .
При использовании квадратных скобок и отсутствии элемента в словаре вызывается ошибка KeyError. При использовании метода get() и отсутствии элемента возвращается None .
Вывод:
Как изменить или добавить элементы в словаре
Словари — изменяемый тип данных. Это значит, что в него можно добавить новые элементы или изменить уже существующие с помощью оператора присваивания.
Если добавляемый ключ есть в словаре, значение элемента изменяется. Если же такого ключа еще нет, то в словарь добавляется новая пара (ключ: значение) .
Вывод:
Как удалить элементы из словаря
Удалить нужный элемент словаря по ключу можно с помощью метода pop() . Этот метод удаляет элемент с соответствующим ключом и возвращает значение.
Удалить произвольную пару (ключ, значение) можно с помощью метода popitem() . Очистить весь словарь за один раз можно с помощью метода clear() .
Также можно использовать ключевое слово del для удаления отдельных элементов или же всего словаря.
Вывод:
Методы словарей
В таблице ниже указаны доступные методы словарей. Некоторые из них мы уже использовали в примерах выше.
Метод
Что делает
Удаляет все элементы из словаря
Возвращает неглубокую копию словаря
Возвращает словарь с ключами из seq и значениями, равными v (по умолчанию None )
Возвращает значение ключа key . Если key не существует, возвращает d (по умолчанию None )
Возвращает новый объект элементов словаря в формате (ключ, значение)
Возвращает новый объект с ключами словаря
Удаляет элемент с ключом key и возвращает его значение или d , если key не найден. Если d не было обозначено и key не найден, вызывает ошибку KeyError.
Удаляет и возвращает произвольную пару (ключ, значение) . Вызывае ошибку KeyError, если словарь пустой.
Если ключ key есть в словаре, возвращает соответствующее ему значение. Если нет, добавляет в словарь элемент с ключом key и значением d и возвращает d (по умолчанию None )
Обновляет словарь имеющимися парами ключ/значение из other , перезаписывая существующие ключи
Возвращает новый объект со значениями словаря
Вывод:
Представление словарей
Представление словарей — элегантный и лаконичный способ создать новый словарь из итерируемого объекта.
Представление словарей состоит из выражения ключ: значение , за которым следует for , и всё это — внутри фигурных скобок <> .
Создадим словарь с парами чисел и их квадратов в качестве элементов:
Вывод:
То же самое можно сделать иначе, но так будет длинее:
Вывод:
В представлении словарей выражений for и if опционально может быть больше.
Необязательное выражение if поможет отфильтровать элементы для создания нового словаря.
Давайте создадим словарь только с квадратами только нечетных чисел:
Вывод:
Другие операции со словарями
Проверка на вхождение в словарь
Проверить, есть ли ключ в словаре, можно с помощью ключевого слова in . Отметим, что проверку на вхождение можно провести только над ключами, не над значениями
Вывод:
Итерирование по словарю
Мы можем пройтись по всем ключам словаря, используя цикл for .
Вывод:
Встроенные функции для словарей
Встроенные функции all() , any() , len() , cmp() , sorted() и т. д. часто используются со словарями для разных задач.
Функция
Описание
Возвращает True , если все ключи словаря = True (или если словарь пуст)
Возвращает True , если хотя бы один ключ словаря = True . Если словарь пуст, возвращает False .
Урок 2
Типы данных

Языки высокого уровня работают не с битами и байтами, а с более абстрактными структурами данных — типами, поэтому эти языки принято считать типизированными.
- Явная / неявная
- Статическая / динамическая
Если подвести итог относительно языка, ради которого мы тут собрались, то: Python — это язык с неявной(динамической) типизаций. На практике это значит, что при создании переменной намеренно указывать ее тип НЕ нужно. Идем дальше.
- Встроенные в интерпретатор (built-in) и
- Не встроенные, которые можно использовать после импорта соответствующих модулей.
- int – целое число
- float – число с плавающей точкой
- complex – комплексное число
- list– список
- tuple – кортеж
- str
- bytes – байты
- bytearray – массивы байт
- memoryview – специальные объекты для доступа к внутренним данным объекта через protocol buffer
- set– множество
- frozenset– неизменяемое множество
- dict – словарь
Последовательности в Python
Последовательность(Sequence Type) — итерируемый контейнер, к элементам которого есть эффективный доступ с использованием целочисленных индексов.
Последовательности могут быть как изменяемыми, так и неизменяемыми. Размерность и состав созданной однажды неизменяемой последовательности не может меняться, вместо этого обычно создаётся новая последовательность.
-
— изменяемая — неизменяемая — неизменяемая — неизменяемая
Задачи по темам

Списки в Python — упорядоченные изменяемые коллекции объектов произвольных типов (почти как массив, но типы элементов могут отличаться).
Чтобы использовать списки, их нужно создать. Создать список можно двумя способами(их вообще больше, но для простоты рассмотрим два самых часто используемых).
Способ 1. Использовать квадратные скобки.

Т. о. список может содержать любое количество любых объектов (в том числе и вложенные списки), или не содержать ничего.
Далее переходим к действиям со списками. Рассмотрим основные методы:
ВАЖНО!
Нужно отметить, что методы списков, в отличие от строковых методов, изменяют сам список, а потому результат выполнения не нужно записывать в эту переменную.
Т. о. список может содержать любое количество любых объектов (в том числе и вложенные списки), или не содержать ничего.
Далее переходим к действиям со списками. Рассмотрим основные методы:
Читайте также

Кортеж(tuple) – это неизменяемая структура данных, которая по своему подобию очень похожа на список. Кортеж, по сути — неизменяемый список.
- Защита от дурака. То есть кортеж защищен от изменений, как намеренных(что плохо), так и случайных (что хорошо).
- Кортежи в памяти занимают меньший объем по сравнению со списками.
- Возможность использовать кортежи в качестве ключей словаря(словари рассмотрим далее). Список в качестве ключа использовать не получится.
Способ 1. Использовать метод tuple() :
- Можно применять операции над списками, не изменяющие список (сложение, умножение на число, методы index() и count() и некоторые другие операции).
- Доступ к элементам кортежа осуществляется также как к элементам списка – через указание индекса. Но, как уже было сказано – изменять элементы кортежа нельзя!
- Удалить отдельные элементы из кортежа невозможно. Но можно удалить кортеж целиком.
- На базе кортежа можно создать список, верно и обратное утверждение.

Словари(dict) в Python — неупорядоченные коллекции произвольных объектов с доступом по ключу. Их иногда ещё называют ассоциативными массивами или хеш-таблицами.
Создать словарь можно двумя способами(их вообще 4, но для простоты рассмотрим два самых часто используемых).
Способ 1. Использовать фигурные скобки <> .

Обратите внимание
Присвоение по новому ключу расширяет словарь, присвоение по существующему ключу перезаписывает его, а попытка извлечения несуществующего ключа порождает исключение. Для избежания исключения можно действовать в соответствии с одной из двух стратегий:
1) Для получения элемента использовать метод dict.get(key[, default]) (см. таблицу)
2) Перехватывать и обрабатывать исключение

Множество(set) – это «контейнер», содержащий не повторяющиеся элементы в случайном порядке.
Создать множество можно 2 способами:
Способ 1. Использовать метод set() :
Неизменяемое множество (Frozenset)
Единственное отличие set от frozenset заключается в том, что set — изменяемый тип данных, а frozenset — нет. Примерно похожая ситуация со списками и кортежами.
Например, если создать неизменяемое множество frozen_set и попробовать вызвать для него метод frozen_set.add(‘2’) , нас ждет провал — добавить новый элемент в уже существующее неизменяемое множество нельзя.
Создать неизменяемое множество можно с помощью метода frozenset() :
Например, f_st = frozenset(‘Word’)
11. Словари¶
Все изученные нами до сих пор составные типы данных — строки, списки и кортежи — это последовательности, использующие целые числа как индексы для доступа к их отдельным элементам.
Словарь (англ.: dictionary) — составной тип, отличающийся от последовательностей, и относящийся к встроенному типу Python отображение. Словари отображают ключи, которые могут быть любого из неизменяемых типов, на значения, которые могут быль любого типа, так же как значения элементов списка или кортежа.
В качестве примера, создадим словарь для перевода английских слов на испанский. В этом словаре ключами будут строки.
Один из способов создать словарь — это начать с пустого словаря и добавить в него нужные пары ключ-значение. Пустой словарь обозначается <> :
Первое предложение присваивания создает словарь с именем eng2sp . далее мы просим Python сообщить нам тип созданного объекта. Два следующих предложения присваивания добавляют в словарь пары ключ-значение. Можно напечатать текущее значение словаря уже привычным нам способом:
Пары ключ-значение в словаре разделены запятыми. Каждая пара содержит разделенные двоеточием ключ и значение.
Пары в словаре могут оказаться не в том порядке, как вы ожидали. Python использует сложный алгоритм, чтобы определить, где в словаре хранить каждую пару ключ-значение. Мы же просто можем считать, что пары в словаре хранятся в случайном порядке.
Другой способ создать словарь — сразу задать список пар ключ-значение, воспользовавшись тем же синтаксисом, что мы видим при выводе словаря:
Не имеет значения, в каком порядке мы записываем пары. Значения извлекаются из словаря по ключу, а не по индексу, так что заботиться об упорядочении пар не нужно.
Вот как получают значение с помощью ключа:
Ключу 'two' соответствует значение 'dos' .
11.2. Словарные операции¶
Предложение del удаляет из словаря пару ключ-значение. Например, следующий словарь содержит названия различных фруктов и их количество на складе:
Если кто-то купит все груши (англ.: pears), то можно удалить соответствующую пару из словаря:
А если мы ожидаем, что вскоре запас груш пополнится, можно просто изменить значение для ключа ‘pears’:
Функция len также работает для словарей; она возвращает количество пар ключ-значение в словаре:
11.3. Словарные методы¶
Словари имеют много полезных встроенных методов.
Метод keys (англ.: ключи) возвращает список ключей словаря.
Как и ранее со строками и списками, вызов словарных методов использует точечную нотацию, где слева от точки помещается имя объекта, а справа — имя метода, вызываемого для этого объекта. Пустые скобки показывают, что этот метод не имеет параметров.
В данном случае можно сказать, что метод keys вызван для объекта eng2sp . Как мы увидим далее в главах об объектно-ориентированном программировании, объект, для которого вызывается метод, — на самом деле первый аргумент при вызове этого метода.
Метод values (англ.: значения) подобен методу keys , он возвращает список значений словаря:
Метод items (англ.: пункты, статьи) возвращает ключи и значения в виде списка кортежей, по одному кортежу для каждой пары ключ-значение:
Метод has_key берет ключ в качестве аргумента и возвращает True , если ключ имеется в словаре, и False в противном случае:
Этот метод может быть очень полезен, так как попытка получить значение из словаря по несуществующему ключу вызывает ошибку выполнения:
11.4. Альтернативные имена и копирование¶
Поскольку словари изменяемы, вам следует помнить об альтернативных именах. Когда две переменные ссылаются на один и тот же объект, изменения, сделанные для одной переменной, влияют на другую.
Если необходимо изменить словарь и при этом сохранить оригинал, воспользуйтесь методом copy . Например, словарь opposites (англ.: противоположности) содержит пары противоположностей:
alias и opposites указывают на один и тот же объект, тогда как copy указывает на копию словаря. Если изменить alias , то opposites тоже изменится:
Если же изменить copy , opposites не изменится:
11.5. Разреженные матрицы¶
Ранее мы использовали список списков для того, чтобы представить матрицу. Это хороший подход для матриц, в которых большинство значений ненулевые, но посмотрите на разреженную матрицу, такую как эта:

Списочное представление матрицы хранит много нулей:
Альтернативой является использование словаря. В качестве ключа можно использовать кортеж с номерами строки и столбца. Вот словарное представление этой же матрицы:
Нам нужны только три пары ключ-значение, одна для каждого ненулевого элемента матрицы. Ключи — кортежи, а значения — целые числа.
Для доступа к элементу матрицы можно использовать оператор [] :
Заметьте, что синтаксис словарного представления не такой, как синтаксис представления с помощью вложенных списков. Вместо двух целочисленных индексов, теперь для доступа к элементу матрицы мы используем один ключ — кортеж из двух целых чисел.
Но есть одна проблема. Если мы захотим получить нулевой элемент, то получим ошибку, поскольку в словаре нет пар для нулевых элементов матрицы:
Эту проблему решает метод get :
В качестве первого аргумента указывается ключ; второй аргумент — значение, которое вернет метод get в случае, если ключ отсутствует в словаре:
Метод get определенно улучшает доступ к элементам разреженной матрицы.
11.6. Кэш вычисленных значений¶
Если вы поиграли с функцией fibonacci из последней главы, то вы, должно быть, заметили, что чем большее число вы указываете в качестве аргумента, тем большее время требуется функции для выполнения. Более того, время выполнения возрастает очень быстро. На одном из наших компьютеров fibonacci(20) выполняется мгновенно, fibonacci(30) занимает около секунды, а fibonacci(40) выполняется едва ли не бесконечно.
Чтобы понять, почему, давайте рассмотрим следующий граф вызовов для fibonacci с n = 4 :

Граф вызовов содержит прямоугольники функций и направленные линии, соединяющие каждый прямоугольник с прямоугольниками функций, которые он вызывает. Вверху рисунка, fibonacci с n = 4 вызывает fibonacci с n = 3 и n = 2 . В свою очередь, fibonacci с n = 3 вызывает fibonacci с n = 2 и n = 1 . И так далее.
Посчитайте, сколько раз вызываются fibonacci(0) и fibonacci(1) . Данное решение неэффективно, и оно работает тем хуже, чем большим становится аргумент.
Хорошим решением может быть сохранение однажды вычисленных значений в словаре. Прием, предусматривающий сохранение вычисленных или извлеченных данных в месте, откуда их легко получить, называется кэшированием данных, а само место хранения этих данных — кэшем. Вот вариант fibonacci , использующий словарь в качестве кэша:
Словарь с именем previous отслеживает числа Фибоначчи, которые мы уже знаем. Начинаем всего с двух пар: 0 отображается на 1; и 1 отображается на 1.
При каждом вызове fibonacci проверяет, не содержит ли уже словарь нужный результат. Если да, то функция немедленно возвращает результат, не выполняя рекурсивных вызовов. Если нет, то придется вычислить новое значение. Новое значение добавляется в словарь, прежде чем функция возвращает его.
Эта версия fibonacci на наших компьютерах вычисляет fibonacci(100) в мгновенье ока.
L в конце числа показывает, что это число имеет тип long (англ.: длинный).
11.7. Длинные целые¶
Python предоставляет тип long , который может справиться с целым числом любого размера. Ограничением будет только размер памяти вашего компьютера.
Есть три способа создать значение типа long . Первый — вычислить арифметическое выражение, результат которого слишком большой, чтобы поместиться в int . Мы уже видели это в примере fibonacci(100) выше. Другой способ — записать число с большой буквой L в конце:
Третий — вызвать long() со значением, которое нужно преобразовать в long . Вызов long может преобразовывать значения int , float и даже строки цифр в длинные целые:
11.8. Подсчитываем буквы¶
В главе 7 мы написали функцию, подсчитывающую количество вхождений некоторой буквы в строку. Теперь поставим такую задачу: сформировать гистограмму для букв в строке, то есть, показать, сколько раз в строке встречается каждая буква.
Такая гистограмма может быть полезна для сжатия текстового файла. Поскольку разные буквы встречаются в тексте с разной частотой, можно сжать файл, используя более короткие коды для часто встречающихся букв и более длинные — для букв, которые встречаются реже.
Словари позволяют элегантно построить гистограмму:
Мы начинаем с пустого словаря. Для каждой буквы в строке, мы отыскиваем в словаре, сколько раз эта буква уже нам встретилась (возможно, 0), и увеличиваем это значение на 1. В конце словарь содержит пары буква — количество вхождений.
Было бы красивее отобразить гистограмму в алфавитном порядке. Можно сделать это с помощью методов items и sort :
11.9. Глоссарий¶
11.10. Упражнения¶
Напишите программу, которая читает строку из командной строки и возвращает таблицу букв алфавита, встречающихся в строке, в алфавитном порядке, вместе с количеством вхождений каждой буквы. Регистр букв следует игнорировать. Пробный запуск программы выглядит так:
Посмотрите, как реагирует Python на каждый из следующих фрагментов кода, введенных в интерактивном режиме: