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

Список и словарь относятся к числу надежных структур данных в Python. Преобразование друг из друга — самая частая задача, с которой вы когда-либо сталкивались при разработке Python. Вы часто обнаруживаете, что вам нужно создать словарь из двух разных, но тесно связанных последовательностей. Самый простой способ добиться этого — использовать вместе методы dict() и zip() .
Python Zip
Чтобы создать словарь из двух последовательностей, используйте методы dict() и zip(). В Python 3 метод zip() теперь возвращает ленивый итератор, который сейчас является наиболее часто используемым подходом.
Для dict(zip(ключи, значения)) требуется одноразовый глобальный поиск для dict и zip. Тем не менее, он не создает ненужных промежуточных структур данных и не занимается локальным поиском в приложении функций.
В этом примере мы определили два списка, которые нам нужно преобразовать в словарь. Первый список элементов будет ключами для словаря, а второй список элементов будет словарем значений.
Метод zip(fields, values) возвращает итератор, который генерирует кортежи из двух элементов. Если вы вызываете dict() на этом итераторе, вы можете создать нужный вам словарь. Элементы первого списка становятся ключами словаря, а элементы второго списка представляют значения в словаре.
Важно отметить, что dictionary =
Понимание словаря
Понимание словаря — это элегантный и лаконичный способ создания словарей. Мы можем использовать приведенный выше пример для создания словаря из двух списков.
Python Tips, Tricks, and Hacks (часть 2)
К сожалению, нельзя написать программу только с помощью генераторов списков. (Я шучу… конечно, можно.) Они могут отображать и фильтровать, но нет простого способа для свертки списка. Под этим понятием я подразумеваю применение функции к первым двум элементам списка, а затем к получившемуся результату и следующему элементу, и так до конца списка. Можно реализовать это через цикл for:
А можно воспользоваться встроенной функцией reduce, принимающей в качестве аргументов функцию от двух параметров и список:
Не так красиво, как генераторы списков, но короче обычного цикла. Стоит запомнить этот способ.
2.3 Прохождение по списку: range, xrange и enumerate
Помните, как в языке C для цикла for вы использовали переменную-счетчик вместо элементов списка? Возможно, вы уже знаете, как имитировать это поведение в Python с помощью range и xrange. Передавая число value функции range, мы получим список, содержащий элементы от 0 до value-1 включительно. Другими словами, range возвращает индексы списка указанной длины. xrange действует похоже, но более эффективно, не загружая весь список в память целиком.
Проблема в том, что обычно вам всё равно нужны элементы списка. Что толку от индексов без них? В Python есть потрясающая встроенная функция enumerate, которая воозвращает итератор для пар индекс → значение:
Еще один плюс состоит в том, что enumerate выглядит более читаемо, чем xrange(len()). Поэтому range и xrange полезны, наверно, только для создания списка с нуля, а не на основе других данных.
2.4 Проверка всех элементов списка на выполнение условия
Допустим, нам надо проверить, выполняется ли условие хотя бы для одного элемента. До Python 2.5 можно было писать так:
Аналогично, может возникнуть задача проверки, что все элементы удовлетворяют условию. Без Python 2.5 придется писать так:
Здесь мы фильтруем список и проверяем, уменьшилась ли его длина. Если нет, то все его элементы удовлетворяют условию. Опять же, без Python 2.5 это единственный способ уместить всю логику в одно выражение.
В Python 2.5 есть более простой путь — встроенная функция all. Легко догадаться, что она прекращает проверку после первого элемента, не удовлетворяющего условию. Эта функция работает абсолютно аналогично предыдущей.
2.5 Группировка элементов нескольких списков
Встроенная функция zip используется для сжимания нескольких списков в один. Она возвращает массив кортежей, причем n-й кортеж содержит n-е элементы всех массивов, переданных в качестве аргументов. Это тот случай, когда пример — лучшее объяснение:
Эта вещь часто используется как итератор для цикла for, извлекающая три значения за одну итерацию («for letter, number, squares in zipped_list»).
2.6 Еще несколько операторов для работы со списками
Ниже перечислены встроенные функции, в качестве аргумента принимающие любой итерируемый объект.
max и min возвращают наибольший и наименьший элемент соответственно.
sum возвращает сумму всех элементов списка. Опциональный второй параметр задает начальную сумму (по умолчанию 0).
2.7 Продвинутые логические операции с типом set.
Я понимаю, что в разделе, посвященном спискам, не положено говорить о сетах (sets). Но пока я не использовал их, мне не хватало некоторых логических операций в списках. Сет отличается от списка тем, что его элементы уникальны и неупорядоченны. Над сетами также можно выполнять множество логических операций.
Довольно распространенная задача — убедиться, что элементы списка уникальны. Это просто, достаточно преобразовать его в сет и проверить, изменилась ли длина:
Конечно, вы можете преобразовать сет обратно в список, но не забывайте, что порядок элементов мог не сохраниться. Больше информации об операциях с сетами вы найдете в документации.
3 Словари
3.1 Создание словаря с помощью именованных аргументов
Когда я начал изучать Python, я полностью пропустил альтернативный способ создания словаря. Если передать конструктору dict именованные аргументы, они будут добавлены в возращаемый словарь. Конечно, на его ключи накладываются те же ограничения, что и на имена переменных. Вот пример:
Этот способ немного очищает код, избавляя вас от летающих вокруг кавычек. Я часто использую его.
3.2 Преобразование словаря в список
Чтобы получить список ключей, достаточно привести словарь к типу list. Но лучше использовать .keys() для получения списка ключей или .iterkeys() для получения итератора. Если вам нужны значения, используйте .values() и .itervalues(). Но помните, что словари не упорядочены, поэтому полученные значения могут быть перемешаны любым мыслимым образом.
Чтобы получить и ключи, и значения в виде списка кортежей, можно использовать .items() или .iteritems(). Возможно, вы часто пользовались этим захватывающим методом:
3.3 Преобразование списка в словарь
Обратная операция — превращение списка, содержащего пары ключ-значение, в словарь — делается так же просто:
Вы можете комбинировать методы, добавив именованные аргументы:
Превращать списка и словари друг в друга довольно удобно. Но следующий совет просто потрясающий.
3.3 «Dictionary Comprehensions»
Хотя в Python нет встроенного генератора словарей, можно сделать нечто похожее ценой небольшого беспорядка в коде. Используем .iteritems() для превращения словаря в список, передадим его выражению-генератору или генератору списков, а затем преобразуем список обратно в словарь.
Допустим, у нас есть словарь пар name:email, а мы хотим получить словарь пар name:is_email_at_a_dot_com (проверить каждый адрес на вхождение подстроки .com):
Конечно, необязательно начинать и заканчивать словарем, можно в некоторых местах использовать и списки.
Это чуть менее читабельно, чем строгие генераторы списков, но я считаю, что это лучше, чем большой цикл for.
Как из списка сделать словарь python
Словарь (dictionary) в языке Python хранит коллекцию элементов, где каждый элемент имеет уникальный ключ и ассоциированое с ним некоторое значение.
Определение словаря имеет следующий синтаксис:
В фигурных скобках через запятую определяется последовательность элементов, где для каждого элемента сначала указывается ключ и через двоеточие его значение.
В словаре users в качестве ключей используются числа, а в качестве значений — строки. То есть элемент с ключом 1 имеет значение «Tom», элемент с ключом 2 — значение «Bob» и т.д.
В словаре emails в качестве ключей используются строки — электронные адреса пользователей и в качестве значений тоже строки — имена пользователей.
Но необязательно ключи и строки должны быть однотипными. Они могу представлять разные типы:
Мы можем также вообще определить пустой словарь без элементов:
Преобразование списков и кортежей в словарь
Несмотря на то, что словарь и список — непохожие по структуре типы, но тем не менее существует возможности для отдельных видов списков преобразования их в словарь с помощью встроенной функции dict() . Для этого список должен хранить набор вложенных списков. Каждый вложенный список должен состоять из двух элементов — при конвертации в словарь первый элемент станет ключом, а второй — значением:
Подобным образом можно преобразовать в словарь двухмерные кортежи, которые в свою очередь содержать кортежи из двух элементов:
Получение и изменение элементов
Для обращения к элементам словаря после его названия в квадратных скобках указывается ключ элемента:
Например, получим и изменим элементы в словаре:
Если при установки значения элемента с таким ключом в словаре не окажется, то произойдет его добавление:
Но если мы попробуем получить значение с ключом, которого нет в словаре, то Python сгенерирует ошибку KeyError:
И чтобы предупредить эту ситуацию перед обращением к элементу мы можем проверять наличие ключа в словаре с помощью выражения ключ in словарь . Если ключ имеется в словаре, то данное выражение возвращает True:
Также для получения элементов можно использовать метод get , который имеет две формы:
get(key) : возвращает из словаря элемент с ключом key. Если элемента с таким ключом нет, то возвращает значение None
get(key, default) : возвращает из словаря элемент с ключом key. Если элемента с таким ключом нет, то возвращает значение по умолчанию default
Удаление
Для удаления элемента по ключу применяется оператор del :
Но стоит учитывать, что если подобного ключа не окажется в словаре, то будет выброшено исключение KeyError. Поэтому опять же перед удалением желательно проверять наличие элемента с данным ключом.
Другой способ удаления представляет метод pop() . Он имеет две формы:
pop(key) : удаляет элемент по ключу key и возвращает удаленный элемент. Если элемент с данным ключом отсутствует, то генерируется исключение KeyError
pop(key, default) : удаляет элемент по ключу key и возвращает удаленный элемент. Если элемент с данным ключом отсутствует, то возвращается значение default
Если необходимо удалить все элементы, то в этом случае можно воспользоваться методом clear() :
Копирование и объединение словарей
Метод copy() копирует содержимое словаря, возвращая новый словарь:
Метод update() объединяет два словаря:
При этом словарь users2 остается без изменений. Изменяется только словарь users, в который добавляются элементы другого словаря. Но если необходимо, чтобы оба исходных словаря были без изменений, а результатом объединения был какой-то третий словарь, то можно предварительно скопировать один словарь в другой:
Перебор словаря
Для перебора словаря можно воспользоваться циклом for:
При переборе элементов мы получаем ключ текущего элемента и по нему можем получить сам элемент.
Другой способ перебора элементов представляет использование метода items() :
Метод items() возвращает набор кортежей. Каждый кортеж содержит ключ и значение элемента, которые при переборе мы тут же можем получить в переменные key и value.
Также существуют отдельно возможности перебора ключей и перебора значений. Для перебора ключей мы можем вызвать у словаря метод keys() :
Правда, этот способ перебора не имеет смысла, так как и без вызова метода keys() мы можем перебрать ключи, как было показано выше.
Для перебора только значений мы можем вызвать у словаря метод values() :
Комплексные словари
Кроме простейших объектов типа чисел и строк словари также могут хранить и более сложные объекты — те же списки, кортежи или другие словари:
В данном случае значение каждого элемента словаря в свою очередь представляет отдельный словарь.
Для обращения к элементам вложенного словаря соответственно необходимо использовать два ключа:
Но если мы попробуем получить значение по ключу, который отсутствует в словаре, Python сгенерирует исключение KeyError:
Чтобы избежать ошибки, можно проверять наличие ключа в словаре:
Во всем остальном работа с комплексными и вложенными словарями аналогична работе с обычными словарями.