Как перебрать ключи словаря питон

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

Подробное руководство по использованию разных способов перебора содержимого словаря в Python

Введение

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

Использование метода keys

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

Имейте в виду, что начиная с Python 3 этот метод не возвращает список, а возвращает объект представления. Объект представления — это возвращаемое значение исходного объекта, изменения которого не влияют на исходный объект. Для внесения изменений и сохранения данных в измененном объекте представления необходимо присвоить его какой-либо переменной.

Давайте посмотрим, как это работает:

Результат выполнения кода

Итерация словаря по ключу в цикле for с указанием индекса элемента

Результат выполнения кода

При использовании ключевого слова in в цикле for словарь вызывает свой метод iter. Затем этот метод возвращает итератор, который используется для неявного просмотра ключей предоставленного словаря.

Использование метода value

Так же как и метод keys, метод value возвращает объект представления, но вместо итерации по ключу, он итератует по значениям:

Результат выполнения кода

Итерация словаря по значению в цикле for

Результат выполнения кода

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

Использование метода items

Так же как и методы keys и values, метод items возвращает объект представления, но вместо того, чтобы просто выполнять итерации по ключам или значениям, он выполняет итерации по индексу словарю (ключу и значению одновременно).

Давайте посмотрим как это работает

Результат выполнения кода

Итерация словаря по паре клюк:значение происходит следующим образом

Результат выполнения кода

Важно отметить, что в старых версиях Python, где items, keys и values возвращали копию данных из словаря, Python 3 возвращает объект представления.

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

Заключение

В этой статье мы рассмотрели различные способы итерации по словарю в Python используя методы keys(), values() и items().

Источник

Словари в Python

Содержание страницы:
1.1. Создание словаря на Python
1.2. Обращение к значению, связанному с ключом в словаре
1.3. Добавление новых пар «ключ-значение»
1.4. Удаление пар «ключ-значение»
1.5. Обращение к значениям методом get()
1.6. Проверка наличия заданного ключа в словаре
2.1. Перебор пар «ключ-значение» методом items()
2.2. Перебор всех ключей в словаре методом keys()
2.3. Перебор всех значений в словаре метод values()
3. Список словарей в Python
4. Список в словаре Python
5. Словарь в словаре Python

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

Для создания словаря заключите в фигурные скобки <> список пар «ключ-значение», разделенных запятыми, в форме ключ: значение. Значением может быть число, список, строка и даже другой словарь. В примере ниже хранится информация об одном автомобиле.

В данном примере ключом является ‘марка’, а значение ‘bmw’. Затем через запятую идет следующая пара ключ-значение и так далее. Если вы укажете ключ, то Python вернет значение, связанное с этим ключом. Ключ от значения всегда отделяется двоеточием.

В данном примере возвращается значения связанных с ключом в словаре с помощью f-строк строится сообщение.

1.3. Добавление новых пар «ключ-значение»

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

В итоге мы получили в словаре новую пару «ключ-значение» ‘цвет’: ‘белый’. Таким образом можно добавлять неограниченное количество пар.

1.4. Удаление пар «ключ-значение»

>>> car_1. pop (‘mileage’)
58135
>>> print (car_1)

>>> car_1 = <'brand': 'bmw', 'type': 'седан', 'mileage': 58135>
>>> color = car_1. get (‘color’, ‘Такого ключа не существует’)
>>> print (color)
Такого ключа не существует

В результате вместо ошибки, мы получили сообщение о отсутствие ключа в словаре.

1.6. Проверка наличия заданного ключа в словаре Python.

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

>>> car_1 = <'brand': 'bmw', 'type': 'седан', 'mileage': 58135>
>>> ‘type’ in car_1
True
>>> ‘color’ in car_1
False
>>> ‘color’ not in car_1
True

В начале в цикле for Python перебирает все пары «ключ-значение» в словаре. В процессе перебора ключ сохраняется в переменной month, а значение в переменной days. Затем создается условие, если количество дней четное, то выводится команда print с названием месяца и количества дней с окончанием «дней». Если количество не чётное, то пишется «день».

Метод keys() удобен если вы собираетесь работать с ключами в словаре. Переберем словарь и выведем все ключи в нем:

В Python перебор ключей используется по умолчанию при переборе словаря. Две записи ниже дают один и тот же результат.

Явный вызов метода keys() может упростить чтение вашего кода.

>>> for key in sorted( year.keys() ) :
. print (key)
.
апрель
март
февраль
январь

В результате ключи сортируются по алфавиту.

3. Список словарей в Python.

В Python можно сохранить множество словарей в списки или список сделать значением элемента словаря. Создание таких сложных структур называется вложениями. Можно вложить не ограниченное количество словарей в список.

Далее создаем пустой список и добавляем в него словари.

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

4. Список в словаре Python.

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

Alex любит автомобили марки:
Bmw
Audi
Mersedes

Artem любит автомобили марки:
Audi

Phil любит автомобили марки:
Ford
Porshe

Jon любит автомобили марки:
Lada

В процессе перебора словаря имя сохраняется в переменной name, а список в переменную cars. Выводим сообщение с помощью f-строки с именем опрашиваемого, затем с помощью цикла for перебираем элементы списка и выводим названия брендов с новой строки.

5. Словарь в словаре Python

Словарь тоже можно вложить в словарь. Например, словарь с пользователями на сайте. У каждого пользователя хранится информация о нем имя и фамилия.

Ваш логин: qwerty
Добро пожаловать на сайт John Brut!

Ваш логин: fill
Добро пожаловать на сайт Philip Ivanov!

Источник

Эффективный обход словарей в цикле в Python

Словарь (dictionary, dict) — это ассоциативный массив, который позволяет сохранять значения по ключам.

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

В Python большое внимание уделяется циклам. Правильно написанный заголовок цикла содержит много ценной информации: по чему итерируемся и какие данные будут использоваться в теле цикла. Это помогает читателю понять (или хотя бы предположить), что именно будет производиться в теле цикла, даже не смотря в него. Неправильно написанный цикл, который не выражает напрямую задумку автора, наоборот, сбивает читателя с толку и заставляет читать код целиком, возможно, даже не один раз.

Есть несколько способов обойти словарь в цикле. Очень важно научиться выбирать наиболее подходящий.

Что будет если просто попытаться обойти словарь в цикле?

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

Самый очевидный вариант обхода словаря — это попытаться напрямую запустить цикл for по объекту словаря, так же как мы делаем это со списками, кортежами, строками и любыми другими итерируемыми объектами.

Словарь и правда поддерживает протокол итераций, но словарь не так прост, как другие объекты, которые мы упомянули выше. Словарь состоит из нескольких частей, ведь словарь — это отношение между ключами и значениями. Получается, что теоретически цикл по словарю может получать либо ключи, либо значения, либо пары (ключ, значение). Попробуете угадать, что же именно выведет код выше?

А выведет он следующее:

То есть обход словаря в цикле будет возвращать только ключи этого словаря.

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

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

Как обойти в цикле ключи словаря?

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

Что такое представление словаря? Это некий объект, который предоставляет доступ к данным в словаре, либо к части этих данных, и работает по следующим принципам:

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

Давайте добавим новый ключ в словарь:

Как видите, созданное ранее представление словаря обновилось автоматически, когда обновился его словарь.

Обратите внимание, что представление словаря — это не список, а совершенно другой объект. Представление словаря не поддерживает извлечение значений по индексам:

Зато представление словаря является итерируемым объектом и его без проблем можно обходить при помощи цикла:

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

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

Как обойти в цикле значения словаря?

Вот как можно обойти в цикле только значения словаря, без ключей:

По значениям словаря уже невозможно получить ключи (ну, вообще можно попытаться, но для этого потребуется полный перебор словаря, и не факт, что ключи будут восстановлены правильно). Этот способ подойдёт только если в цикле используются исключительно значения словаря, а ключи не нужны.

Как обойти в цикле и ключи, и значения словаря?

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

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

Таким образом можно распаковывать последовательности любого размера. Это намного проще, чем извлекать значения по индексам и присваивать в отдельные переменные. Этот приём можно использовать практически в любом месте программы, в том числе и в заголовке цикла.

Вот так можно обойти ключи и значения словаря, сохраняя ключ и значение в разные переменные прямо в заголовке цикла при помощи распаковки кортежа:

Заключение

При обходе словаря стоит руководствоваться следующей логикой:

Идеоматичный код проще читается и, как правило, работает быстрее.

Посмотрите запись классического выступления Реймонда Хеттингера, где он рассказывает про написание идеоматичного код. Много внимания уделяется циклам и словарям.

Обратите внимание, что это запись выступления от 2013 года, когда ещё вовсю был в ходу Python 2. В выступлении часто сравнивается Python 2 и Python 3. Не запутайтесь.

Если понравилась статья, то подпишитесь на уведомления о новых постах в блоге, чтобы ничего не пропустить!

Источник

Словари в Python 3 — основные методы и функции

В Python есть много встроенных структур данных, используемых для хранения разных типов информации. Словарь ( dict ) — одна из таких структур, которая хранит данные в формате пар ключ-значение. Получить доступ к значениям словаря Python можно с помощью ключей. Этот материал посвящен подробному обсуждению словаря.

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

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

Следующие примеры показывают, как создавать словари Python:

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

Cловарь, где ключи являются целыми числами:

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

Можно также создать словарь, явно вызвав метод dict() :

Словарь можно создать с помощью последовательности, как в примере внизу:

Словари могут быть вложенными. Это значит, что можно создавать словари внутри существующего словаря. Например:

Чтобы вывести содержимое словаря, можно использовать функцию print() и передать название словаря в качестве аргумента. Например:

Доступ к элементами

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

Добавление элементов

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

Вот другой пример. Для начала нужно создать пустой словарь:

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

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

В этом примере 0 является ключом, а «Apples» — значение.

Можно даже добавить несколько значений для одного ключа. Например:

Помимо добавления новых элементов в словарь, их можно обновлять или изменять. Об этом в следующем разделе.

Обновление элементов

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

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

Удалить элемент из словаря можно несколькими способами. В этом разделе они будут рассмотрены по одному:

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

Другой способ удалить пару ключ-значение — функция pop() с ключом записи в виде аргумента. Например:

Функция popitem() удаляет последний элемент в словаре. Для нее не нужно указывать конкретный ключ. Примеры:

Что делать, если нужно удалить целый словарь? Это будет сложно и займет много времени, если пользоваться этими методами к каждому ключу. Вместо этого можно использовать ключевое слово del для целого словаря. Например:

Код вернет ошибку, потому что функция print() пытается получить доступ к словарю, который уже не существует.

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

Код вернет пустой словарь, поскольку все его элементы уже удалены.

Другие распространенные методы словарей

Метод len()

С помощью этого метода можно посчитать количество элементов в словаре. Например:

В этом словаре три записи, поэтому метод вернет 3.

Метод copy()

Этот метод возвращает копию существующего словаря. Например:

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

Метод items()

Этот метод возвращает итерируемый объект. Такой объект содержит пары ключ-значение для словаря по аналогии с кортежами в списке. Метод используется, когда нужно перебрать значения словаря.

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

Вывод демонстрирует, что когда вы меняете значение в словаре, объекты элементов также обновляются.

Метод fromkeys()

Этот метод возвращает словарь с указанными ключами и значениями. У него следующий синтаксис:

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

В коде вверху определены ключи и одно значение. Метод fromkeys() перебирает ключи и объединяет их со значением для создания заполненного словаря.

Значение для параметра keys является обязательным. В следующем примере показано, что происходит, если параметр values не определен:

Метод setdefault()

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

У метода следующий синтаксис:

Следующий пример показывает, как работает метод, если такой ключ уже есть:

Значение «Allion» не повлияло на словарь, потому что у ключа уже есть значение.

Метод keys()

Для использования метода нужно всего лишь использовать его с именем словаря, как показано ниже:

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

Выводы

Это все, что нужно знать о словарях Python. Они хранят информацию в парах «ключ: значение». «Ключ» выступает идентификатором объекта, а «значение» — это определенные данные. В Python много функций, которые могут быть использовать для извлечения и обработки данных. В этой статье были рассмотрены способы создания, изменения и удаления словаря, а также самые распространенные методы для работы с этим типом данных.

Источник

Как перебрать словарь в Python

Словари являются одной из наиболее важных и полезных структур данных в Python. Они могут помочь вам решить широкий спектр задач программирования. Из этой статьи вы узнаете, как итерировать словарь в Python.

К концу этой статьи вы узнаете:

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

Несколько слов о словарях

Словари являются краеугольным камнем Python. Сам язык построен вокруг словарей. Модули, классы, объекты, globals(), locals(): все это словари. Словари были центральным элементом для Python с самого начала.

Официальная документация Python определяет словарь следующим образом:

Ассоциативный массив, где произвольные ключи отображаются на значения. Ключами могут быть любые объекты с методами __hash__() и __eq__(). (Источник)

Есть несколько моментов, о которых следует помнить:

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

В отличие от последовательностей (sequences), которые так же являются итерационными поддерживающими доступ к элементам с использованием целочисленных индексов, словари индексируются по ключам.

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

В Python 3.6 и более поздних версиях ключи и значения словаря перебираются в том же порядке, в котором они были созданы. Однако это поведение может отличаться в разных версиях Python и зависит от истории вставок и удалений словаря.

В Python 2.7 словари являются неупорядоченными структурами. Порядок элементом словарей неизменяемый. Это означает, что порядок элементов является детерминированным и повторяемым. Давайте посмотрим на пример:

Если вы покинете интерпритатор и позже откроете новый интерактивный сеанс, вы получите тот же порядок элементов:

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

В Python 3.5 словари все еще неупорядочены, но на этот раз рандомизированные структуры данных. Это означает, что каждый раз, когда вы снова запускаете словарь, вы получаете другой порядок элементов. Давайте посмотрим:

Если вы войдете в новый интерактивный сеанс, вы получите следующее:

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

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

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

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

Примечание. Все, что описано в этом разделе, относится к базовой реализации Python, CPython.

Другие реализации Python, такие как PyPy, IronPython или Jython, могут демонстрировать другое поведение словаря, которые выходят за рамки данной статьи.

Как перебирать словарь в Python: основы

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

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

Прямая итерация по ключам

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

Чтобы визуализировать методы и атрибуты любого объекта Python, вы можете использовать dir(), которая является встроенной функцией. Если вы запустите dir() с пустым словарем в качестве аргумента, вы сможете увидеть все методы и атрибуты, которые реализуют словари:

Если вы внимательно посмотрите на предыдущий вывод, вы увидите __iter__. Это метод, который вызывается, когда для контейнера требуется итератор, и он должен возвращать новый объект итератора, который может выполнять итерацию по всем объектам в контейнере.

Примечание: вывод предыдущего кода был сокращен (…) для экономии места.

Python достаточно умен, чтобы знать, что a_dict — это словарь и что он реализует .__iter__(). В этом примере Python автоматически вызывает .__iter__(), и это позволяет вам перебирать ключи a_dict.

Это самый простой способ перебора словаря в Python. Просто поместите его прямо в цикл for, и все готово!

Если вы используете этот подход вместе с небольшой уловкой, то вы можете обрабатывать ключи и значения любого словаря. Хитрость заключается в использовании оператора индексации [] со словарем и его ключами для получения доступа к значениям:

Предыдущий код позволил вам получить доступ к ключам (key) и значениям (a_dictКак перебрать ключи словаря питон) a_dict одновременно. Таким образом, вы можете выполнить любую операцию как с ключами, так и со значениями.

Когда вы работаете со словарями, вероятно, вы захотите работать как с ключами, так и со значениями. Одним из наиболее полезных способов перебора словаря в Python является использование метода .items(), который возвращает новый вид элементов словаря:

Представления словаря, такое как d_items, обеспечивают динамическое представление записей словаря, что означает, что при изменении словаря представления отражают эти изменения.

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

Объект представления, возвращаемый функцией .items(), выдает пары ключ-значение по одной и позволяет перебирать словарь, и таким образом, вы получаете доступ к ключам и значениям одновременно.

Если вы присмотритесь к отдельным элементам, полученным с помощью .items(), вы заметите, что они действительно являются кортежами объектов. Давайте посмотрим:

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

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

Примечание: обратите внимание, что .values() и .keys() возвращают объекты представления так же, как .items(), как вы увидите в следующих двух разделах.

Если вам просто нужно работать с ключами словаря, то вы можете использовать метод .keys(), который возвращает новый объект представления, содержащий ключи словаря:

Чтобы перебрать словарь в Python с помощью .keys(), вам просто нужно вызвать .keys() в заголовке цикла for:

Используя тот же трюк, который вы видели ранее (оператор индексации []), вы можете получить доступ к значениям словаря:

Таким образом, вы получите доступ к ключам (key) и значениям (a_dictКак перебрать ключи словаря питон) a_dict одновременно, и вы сможете выполнять с ними любые действия.

Также можно использовать значения для перебора словаря. Один из способов сделать это — использовать .values(), который возвращает представление со значениями словаря:

В предыдущем коде values содержит ссылку на объект представления, содержащий значения a_dict.

Как и любой объект представления, объект, возвращаемый функцией .values(), также может быть итерирован. В этом случае .values() возвращает значения a_dict:

Стоит отметить, что методы keys() и values() также поддерживают тесты членства (in) (membership tests ( in )), что является важной функцией, если вы пытаетесь узнать, есть ли определенный элемент в словаре или нет:

Проверка членства с помощью in возвращает True, если ключ (или значение или элемент) присутствует в тестируемом словаре, и возвращает False в противном случае. Тест на членство позволяет вам не выполнять итерацию по словарю в Python, если вы просто хотите узнать, присутствует ли определенный словарь (или значение, или элемент) в словаре или нет.

Изменение значений и ключей

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

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

В этом примере кода, чтобы изменить значения prices и применить скидку 10%, мы использовали выражение prices[k] = round(v * 0.9, 2).

Так зачем вам использовать оригинальный словарь, если у вас есть доступ к его ключу (k) и его значениям (v)? Если мы можем изменить их напрямую?

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

С другой стороны, ключи могут быть добавлены или удалены из словаря путем преобразования представления, возвращаемого функцией .keys(), в объект list:

Этот подход может иметь некоторые последствия для производительности, в основном связанные с потреблением памяти. Например, вместо объекта просмотра, который выдает элементы по требованию, у вас будет полный новый list в памяти вашей системы. Тем не менее, это может быть безопасным способом изменения ключей при переборе словаря в Python.

Наконец, если вы попытаетесь удалить ключ из prices, используя напрямую .keys(), тогда Python вызовет RuntimeError, сообщающую, что размер словаря изменился во время итерации:

Это потому, что .keys() возвращает объект словаря-представления, который выдает ключи по запросу по одному, и если вы удаляете элемент (del values Как перебрать ключи словаря питон), то Python вызывает RuntimeError, потому что вы изменили словарь во время итерации.

Примечание. В Python 2 объекты .items(), .keys() и .values() возвращают список объектов. Но .iteritems(), iterkeys() и .itervalues() возвращают итераторы. Итак, если вы используете Python 2, то вы можете изменить ключи словаря, используя .keys() напрямую.

С другой стороны, если вы используете iterkeys() в своем коде Python 2 и пытаетесь изменить ключи словаря, вы получите RuntimeError.

Примеры из реального мира

До сих пор вы видели более простые способы перебора словаря в Python. Теперь пришло время посмотреть, как вы можете выполнять некоторые действия с элементами словаря во время итерации. Давайте посмотрим на некоторые примеры из реальной жизни.

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

Превращение ключей в значение и наоборот

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

Выражение new_dict[value] = key сделает всю работу за вас, превратив ключи в значения и используя значения в качестве ключей. Чтобы этот код работал, данные, хранящиеся в исходных значениях, должны иметь тип данных, который можно хэшировать.

Фильтрация

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

В этом примере вы отфильтровали элементы со значением больше 2. Теперь new_dict содержит только элементы, которые удовлетворяют условному значению

Пересмотр выполнение расчетов

Помните пример с продажами компании? Если вы используете генератор списков (list comprehension) для перебора значений словаря, вы получите более компактный, быстрый и Pythonic-код:

Генератор списков создал объект list, содержащий значения incomes, а затем мы суммировали их все с помощью функции sum() и сохранили результат в total_income.

Если вы работаете с действительно большим словарем, и использование памяти является проблемой для вас, тогда вы можете использовать выражение-генератор (generator expression) вместо генератора списков. выражение-генератор — это выражение, которое возвращает итератор. Это похоже на генератор списков, но вместо квадратных скобок для его определения необходимо использовать круглые скобки:

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

Примечание. Если вы новичок в выражение-генератор (generator expressions), вы можете взглянуть на Introduction to Python Generators, чтобы лучше изучить тему.

Наконец, есть более простой способ решить эту проблему, просто используя incomes.values() непосредственно в качестве аргумента для sum():

sum() получает в качестве аргумента итерацию и возвращает общую сумму его элементов. Здесь incomes.values() играет роль итерируемого значения, переданного в sum(). Результат — общий доход, который вы искали.

Удаление выбранных элементов

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

Сортировка словаря

Часто необходимо сортировать элементы коллекции. Начиная с Python 3.6, словари являются упорядоченными структурами данных, поэтому, если вы используете Python 3.6 (и более поздние версии), вы сможете сортировать элементы любого словаря с помощью sorted() и с помощью генератора словаря:

Этот код позволяет создать новый словарь с ключами в отсортированном порядке. Это возможно, потому что sorted(incomes) возвращает список отсортированных ключей, которые можно использовать для создания нового словаря sorted_dict.

Итерация в отсортированном порядке

Иногда вам может понадобиться перебрать словарь в Python, но вы хотите сделать это в отсортированном порядке. Это может быть достигнуто с помощью sorted(). Когда вы вызываете sorted(iterable), вы получаете list с элементами в отсортированном порядке.

Давайте посмотрим, как вы можете использовать sorted() для перебора словаря, когда вам нужно сделать это в отсортированном порядке.

Сортировка по ключам

Если вам нужно перебрать словарь в Python и отсортировать его по ключам, вы можете использовать свой словарь в качестве аргумента для sorted(). Это вернет list, содержащий ключи в отсортированном порядке, и вы сможете их перебирать:

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

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

Сортировка по значениям

Вам также может понадобиться перебрать словарь в Python с его элементами, отсортированными по значениям. Вы также можете использовать sorted(), но со вторым аргументом key.

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

Чтобы отсортировать элементы словаря по значениям, вы можете написать функцию, которая возвращает значение каждого элемента, и использовать эту функцию в key аргумента для sorted():

В этом примере мы определили by_value() и использовали его для сортировки incomes по значению. Затем мы перебираем словарь в порядке сортировки, используя sorted(). Ключевая функция (by_value ()) сообщает sorted() отсортировать incomes.items() по второму элементу каждого элемента, то есть по значению (item [1]).

Вы также можете просто перебирать значения словаря в отсортированном порядке, не беспокоясь о ключах. В этом случае вы можете использовать .values() следующим образом:

sorted(comes.values ()) возвращает значения словаря в отсортированном порядке по вашему желанию. Ключи не будут доступны, если вы используете incomes.values(), но иногда вам не нужны ключи, только значения, и это быстрый способ получить к ним доступ.

Реверсия

Если вам нужно отсортировать словари в обратном порядке, вы можете добавить reverse = True в качестве аргумента для sorted(). Ключевое слово аргумент reverse должно принимать логическое значение. Если установлено значение True, то элементы сортируются в обратном порядке:

Здесь вы перебирали ключи доходов в обратном порядке, используя sorted(incomes, reverse=True) в заголовке цикла for.

Наконец, важно отметить, что sorted() не меняет порядок основного словаря. Что на самом деле происходит, так это то, что sorted() создает независимый список со своими элементами в отсортированном порядке, поэтому incomes остаются прежними:

Иногда нужно перебрать словарь в Python и последовательно удалить его элементы. Для выполнения этой задачи можно использовать .popitem(), которая удалит и возвратит произвольную пару ключ-значение из словаря. С другой стороны, когда вы вызываете .popitem() в пустом словаре, он вызывает ошибку KeyError.

Внутри цикла while мы определили блок try…except для того, чтобы поймать KeyError, сгенерированный функцией .popitems(), когда a_dict станет пустым. В блоке try…except мы обрабатываем словарь, удаляя элемент в каждой итерации. Переменная item хранит ссылку на последующие элементы и позволяет нам выполнять с ними некоторые действия.

Если мы запустим этот скрипт из командной строки, то мы получим следующие результаты:

Здесь .popitem() последовательно удаляет элементы из a_dict. Цикл прервался, когда словарь стал пустым, и .popitem() вызвал исключение KeyError.

Использование некоторых из встроенных функций Python

Python предоставляет некоторые встроенные функции, которые могут быть полезны при работе со словарями. Эти функции являются своего рода инструментом итерации, который предоставляет вам еще один способ перебора словаря. Давайте посмотрим на некоторые из них.

map() определяется как map(function, iterable, …) и возвращает итератор, который применяет функцию к каждому элементу итерируемого. Таким образом, map() можно рассматривать как инструмент итерации, который можно использовать для перебора словаря.

Предположим, у вас есть словарь, содержащий цены на несколько продуктов, и вам нужно применить скидку к ним. В этом случае вы можете определить функцию, которая управляет скидкой, а затем использует ее в качестве первого аргумента для map(). Вторым аргументом может быть price.items():

Здесь map() перебирает элементы словаря (prices.items()), чтобы применить скидку 5% к каждому фрукту с помощью discount(). В этом случае вам нужно использовать dict() для создания словаря new_prices из итератора, возвращаемого map().

Обратите внимание, что discount() возвращает кортеж в форме (key, value), где current_price[0] представляет ключ, а round(current_price [1] * 0.95, 2) представляет новое значение.

filter()

filter () — это еще одна встроенная функция, которую вы можете использовать для перебора словаря и фильтрации некоторых его элементов. Эта функция определяется как filter(function, iterable) и возвращает итератор из тех элементов итерируемого, для которых функция возвращает значение True.

Предположим, вы хотите знать продукты с ценой ниже 0,40. Вам нужно определить функцию, чтобы определить, удовлетворяет ли цена этому условию, и передать ее в качестве первого аргумента для filter(). Вторым аргументом может быть prices.keys():

Здесь вы перебирали ключи prices с помощью filter(). Тогда filter() применяет has_low_price() к каждому ключу prices. Наконец нужно использовать list() для генерации списка продуктов с низкой ценой, потому что filter() возвращает итератор, и нам нужен объект list.

Использование collections.ChainMap

collections — полезный модуль из стандартной библиотеки Python, предоставляющий специализированные типы данных контейнеров. Одним из таких типов данных является ChainMap, который является словарным классом для создания единого представления нескольких сопоставлений (например, словарей). С ChainMap вы можете сгруппировать несколько словарей вместе, чтобы создать одно обновляемое представление.

Теперь предположим, что у вас есть два (или более) словаря, и вам нужно перебирать их вместе как один. Для этого вы можете создать объект ChainMap и инициализировать его своими словарями:

После импорта ChainMap из collections вам необходимо создать объект ChainMap со словарями, которые вы хотите объединить в цепочку, а затем вы можете свободно перебирать полученный объект, как если бы вы делали это с обычным словарем.

Объекты ChainMap также реализуют .keys(), values() и .items(), как это делает стандартный словарь, поэтому вы можете использовать эти методы для итерации по словарному объекту, сгенерированному ChainMap, точно так же, как вы это делаете с обычным словарь:

В этом случае мы вызвали .items() для объекта ChainMap. Объект ChainMap вел себя так, как будто это был обычный словарь, а .items() возвращает объект представления словаря, который можно перебирать как обычно.

Использование itertools

Iterotools — модуль, который предоставляет некоторые полезные инструменты для выполнения итерационных задач. Давайте посмотрим, как можно использовать некоторые из них для перебора словаря в Python.

Циклическая итерация с помощью cycle()

Предположим, вы хотите перебрать словарь в Python, но вам нужно перебирать его несколько раз в одном цикле. Чтобы выполнить эту задачу, вы можете использовать itertools.cycle(iterable), который заставляет итератор возвращать элементы из iterable и сохранять копию каждого из них. Когда итерация исчерпана, cycle() возвращает элементы из сохраненной копии. Это выполняется циклически, поэтому вы можете остановить цикл.

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

Этот код перебирает prices определенное количество раз (в данном случае 3). Этот цикл может длиться столько, сколько нужно, но вы должны позаботиться о его остановке. Условие if прерывает цикл, когда total_items ведет обратный отсчет до нуля.

Итерация с chain()

itertools также предоставляет функцию chain(*iterables), которая получает некоторые итерируемые аргументы в качестве аргументов и создает итератор, который возвращает элементы из итерируемого объекта до тех пор, пока он не будет исчерпан, а затем итерирует по следующему итерируемуго объекту и т. д., пока все они не будут исчерпаны.

Это позволяет вам перебирать несколько словарей в цепочке, как в случае с collections.ChainMap:

В приведенном выше коде chain() вернула итерацию, которая объединила элементы из fruit_prices и vegetable_prices.

Также возможно использовать .keys() или .values(), в зависимости от ваших потребностей, с условием быть однородным: если вы используете .keys() в качестве аргумента для chain(), то вам нужно использовать .keys( ) для остальных из них.

Использование оператора распаковки словаря (**)

Python 3.5 приносит новую и интересную функцию. PEP 448 — Additional Unpacking Generalizations могут упростить вашу жизнь, когда дело доходит до перебора нескольких словарей в Python. Давайте посмотрим, как это работает, на коротком примере.

Предположим, у вас есть два (или более) словаря, и вам нужно выполнять их итерацию вместе, без использования collection.ChainMap или itertools.chain(). В этом случае можно использовать оператор распаковки словаря (**), чтобы объединить два словаря в новый и затем выполнить итерацию по нему:

Оператор распаковки словаря (**) действительно замечательная функция в Python. Она позволяет объединить несколько словарей в один новый, как мы это делали в примере с vegetable_prices и fruit_prices. После объединения словарей с оператором распаковки вы можете перебирать новый словарь как обычно.

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

Ключ pepper присутствует в обоих словарях. После объединения их значение fruit_prices для pepper (0.25) превалирует, потому что fruit_prices — самый последний словарь.

Заключение

В этой статье мы основы того, как перебирать словарь в Python, а также некоторые более продвинутые методы и стратегии!

Вы узнали:

Источник

Добавить комментарий

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